]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/ceph/OSD.js
1 Ext
.define('PVE.CephCreateOsd', {
2 extend
: 'Proxmox.window.Edit',
3 alias
: ['widget.pveCephCreateOsd'],
9 onlineHelp
: 'pve_ceph_osds',
11 initComponent : function() {
15 throw "no node name specified";
21 url
: "/nodes/" + me
.nodename
+ "/ceph/osd",
25 xtype
: 'pveDiskSelector',
27 nodename
: me
.nodename
,
29 fieldLabel
: gettext('Disk'),
33 xtype
: 'pveDiskSelector',
35 nodename
: me
.nodename
,
36 diskType
: 'journal_disks',
37 fieldLabel
: gettext('Journal/DB Disk'),
41 emptyText
: 'use OSD disk'
44 xtype
: 'proxmoxcheckbox',
46 fieldLabel
: 'Bluestore',
57 Ext
.define('PVE.CephRemoveOsd', {
58 extend
: 'Proxmox.window.Edit',
59 alias
: ['widget.pveCephRemoveOsd'],
67 xtype
: 'proxmoxcheckbox',
71 fieldLabel
: gettext('Remove Partitions')
74 initComponent : function() {
79 throw "no node name specified";
81 if (me
.osdid
=== undefined || me
.osdid
< 0) {
82 throw "no osdid specified";
87 me
.title
= gettext('Destroy') + ': Ceph OSD osd.' + me
.osdid
.toString();
90 url
: "/nodes/" + me
.nodename
+ "/ceph/osd/" + me
.osdid
.toString()
97 Ext
.define('PVE.node.CephOsdTree', {
98 extend
: 'Ext.tree.Panel',
99 alias
: ['widget.pveNodeCephOsdTree'],
100 onlineHelp
: 'chapter_pveceph',
102 stateId
: 'grid-ceph-osd',
117 text
: gettext("Class"),
118 dataIndex
: 'device_class',
124 dataIndex
: 'osdtype',
129 text
: "Bluestore Device",
130 dataIndex
: 'blfsdev',
146 renderer: function(value
, metaData
, rec
) {
148 rec
.data
.osdtype
=== 'bluestore' &&
149 rec
.data
.type
=== 'osd') {
161 renderer: function(value
, metaData
, rec
) {
165 var inout
= rec
.data
['in'] ? 'in' : 'out';
166 var updownicon
= value
=== 'up' ? 'good fa-arrow-circle-up' :
167 'critical fa-arrow-circle-down';
169 var inouticon
= rec
.data
['in'] ? 'good fa-circle' :
170 'warning fa-circle-o';
172 var text
= value
+ ' <i class="fa ' + updownicon
+ '"></i> / ' +
173 inout
+ ' <i class="fa ' + inouticon
+ '"></i>';
181 dataIndex
: 'crush_weight',
183 renderer: function(value
, metaData
, rec
) {
184 if (rec
.data
.type
!== 'osd') {
193 dataIndex
: 'reweight',
195 renderer: function(value
, metaData
, rec
) {
196 if (rec
.data
.type
!== 'osd') {
204 header
: gettext('Used'),
208 dataIndex
: 'percent_used',
210 renderer: function(value
, metaData
, rec
) {
211 if (rec
.data
.type
!== 'osd') {
214 return Ext
.util
.Format
.number(value
, '0.00');
219 text
: gettext('Total'),
220 dataIndex
: 'total_space',
222 renderer: function(value
, metaData
, rec
) {
223 if (rec
.data
.type
!== 'osd') {
226 return PVE
.Utils
.render_size(value
);
233 header
: gettext('Latency (ms)'),
237 dataIndex
: 'apply_latency_ms',
239 renderer: function(value
, metaData
, rec
) {
240 if (rec
.data
.type
!== 'osd') {
249 dataIndex
: 'commit_latency_ms',
251 renderer: function(value
, metaData
, rec
) {
252 if (rec
.data
.type
!== 'osd') {
262 initComponent: function() {
263 /*jslint confusion: true */
266 // we expect noout to be not set by default
269 var nodename
= me
.pveSelNode
.data
.node
;
271 throw "no node name specified";
274 var sm
= Ext
.create('Ext.selection.TreeModel', {});
276 var set_button_status
; // defined later
278 var reload = function() {
279 Proxmox
.Utils
.API2Request({
280 url
: "/nodes/" + nodename
+ "/ceph/osd",
283 failure: function(response
, opts
) {
284 var msg
= response
.htmlStatus
;
285 PVE
.Utils
.showCephInstallOrMask(me
, msg
, me
.pveSelNode
.data
.node
,
287 me
.mon(win
, 'cephInstallWindowClosed', function(){
293 success: function(response
, opts
) {
295 me
.setRootNode(response
.result
.data
.root
);
297 // extract noout flag
298 if (response
.result
.data
.flags
&&
299 response
.result
.data
.flags
.search(/noout/) !== -1) {
309 var osd_cmd = function(cmd
) {
310 var rec
= sm
.getSelection()[0];
311 if (!(rec
&& (rec
.data
.id
>= 0) && rec
.data
.host
)) {
314 Proxmox
.Utils
.API2Request({
315 url
: "/nodes/" + rec
.data
.host
+ "/ceph/osd/" +
316 rec
.data
.id
+ '/' + cmd
,
320 failure: function(response
, opts
) {
321 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
326 var service_cmd = function(cmd
) {
327 var rec
= sm
.getSelection()[0];
328 if (!(rec
&& rec
.data
.name
&& rec
.data
.host
)) {
331 Proxmox
.Utils
.API2Request({
332 url
: "/nodes/" + rec
.data
.host
+ "/ceph/" + cmd
,
333 params
: { service
: rec
.data
.name
},
336 success: function(response
, options
) {
337 var upid
= response
.result
.data
;
338 var win
= Ext
.create('Proxmox.window.TaskProgress', { upid
: upid
});
340 me
.mon(win
, 'close', reload
, me
);
342 failure: function(response
, opts
) {
343 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
348 var create_btn
= new Proxmox
.button
.Button({
349 text
: gettext('Create') + ': OSD',
350 handler: function() {
351 var rec
= sm
.getSelection()[0];
353 var win
= Ext
.create('PVE.CephCreateOsd', {
357 me
.mon(win
, 'close', reload
, me
);
361 var start_btn
= new Ext
.Button({
362 text
: gettext('Start'),
364 handler: function(){ service_cmd('start'); }
367 var stop_btn
= new Ext
.Button({
368 text
: gettext('Stop'),
370 handler: function(){ service_cmd('stop'); }
373 var restart_btn
= new Ext
.Button({
374 text
: gettext('Restart'),
376 handler: function(){ service_cmd('restart'); }
379 var osd_out_btn
= new Ext
.Button({
382 handler: function(){ osd_cmd('out'); }
385 var osd_in_btn
= new Ext
.Button({
388 handler: function(){ osd_cmd('in'); }
391 var remove_btn
= new Ext
.Button({
392 text
: gettext('Destroy'),
395 var rec
= sm
.getSelection()[0];
396 if (!(rec
&& (rec
.data
.id
>= 0) && rec
.data
.host
)) {
400 var win
= Ext
.create('PVE.CephRemoveOsd', {
401 nodename
: rec
.data
.host
,
405 me
.mon(win
, 'close', reload
, me
);
409 var noout_btn
= new Ext
.Button({
410 text
: gettext('Set noout'),
411 handler: function() {
412 Proxmox
.Utils
.API2Request({
413 url
: "/nodes/" + nodename
+ "/ceph/flags/noout",
415 method
: noout
? 'DELETE' : 'POST',
416 failure: function(response
, opts
) {
417 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
424 var osd_label
= new Ext
.toolbar
.TextItem({
432 gettext('No OSD selected'),
437 set_button_status = function() {
438 var rec
= sm
.getSelection()[0];
439 noout_btn
.setText(noout
?gettext('Unset noout'):gettext('Set noout'));
442 start_btn
.setDisabled(true);
443 stop_btn
.setDisabled(true);
444 restart_btn
.setDisabled(true);
445 remove_btn
.setDisabled(true);
446 osd_out_btn
.setDisabled(true);
447 osd_in_btn
.setDisabled(true);
451 var isOsd
= (rec
.data
.host
&& (rec
.data
.type
=== 'osd') && (rec
.data
.id
>= 0));
453 start_btn
.setDisabled(!(isOsd
&& (rec
.data
.status
!== 'up')));
454 stop_btn
.setDisabled(!(isOsd
&& (rec
.data
.status
!== 'down')));
455 restart_btn
.setDisabled(!(isOsd
&& (rec
.data
.status
!== 'down')));
456 remove_btn
.setDisabled(!(isOsd
&& (rec
.data
.status
=== 'down')));
458 osd_out_btn
.setDisabled(!(isOsd
&& rec
.data
['in']));
459 osd_in_btn
.setDisabled(!(isOsd
&& !rec
.data
['in']));
461 osd_label
.update(isOsd
?{osd
:rec
.data
.name
}:undefined);
464 sm
.on('selectionchange', set_button_status
);
466 var reload_btn
= new Ext
.Button({
467 text
: gettext('Reload'),
472 tbar
: [ create_btn
, reload_btn
, noout_btn
, '->', osd_label
, start_btn
, stop_btn
, restart_btn
, osd_out_btn
, osd_in_btn
, remove_btn
],
475 fields
: ['name', 'type', 'status', 'host', 'in', 'id' ,
476 { type
: 'number', name
: 'reweight' },
477 { type
: 'number', name
: 'percent_used' },
478 { type
: 'integer', name
: 'bytes_used' },
479 { type
: 'integer', name
: 'total_space' },
480 { type
: 'integer', name
: 'apply_latency_ms' },
481 { type
: 'integer', name
: 'commit_latency_ms' },
482 { type
: 'string', name
: 'device_class' },
483 { type
: 'string', name
: 'osdtype' },
484 { type
: 'string', name
: 'blfsdev' },
485 { type
: 'string', name
: 'dbdev' },
486 { type
: 'string', name
: 'waldev' },
487 { type
: 'string', name
: 'iconCls', calculate: function(data
) {
488 var iconCls
= 'fa x-fa-tree fa-';
491 iconCls
+= 'building';
504 { type
: 'number', name
: 'crush_weight' }],
508 activate: function() {