]>
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>';
180 text
: gettext('Version'),
181 dataIndex
: 'version',
182 renderer: function(value
, metadata
, rec
) {
185 var version
= value
|| "";
186 if (value
&& value
!= me
.maxversion
) {
187 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_OLD');
190 if (!value
&& rec
.data
.type
== 'host') {
191 icon
= '<i class="fa faded fa-cube"></i> ';
192 version
= me
.versions
[rec
.data
.name
] || Proxmox
.Utils
.unknownText
;
195 return icon
+ version
;
200 dataIndex
: 'crush_weight',
202 renderer: function(value
, metaData
, rec
) {
203 if (rec
.data
.type
!== 'osd') {
212 dataIndex
: 'reweight',
214 renderer: function(value
, metaData
, rec
) {
215 if (rec
.data
.type
!== 'osd') {
223 header
: gettext('Used'),
227 dataIndex
: 'percent_used',
229 renderer: function(value
, metaData
, rec
) {
230 if (rec
.data
.type
!== 'osd') {
233 return Ext
.util
.Format
.number(value
, '0.00');
238 text
: gettext('Total'),
239 dataIndex
: 'total_space',
241 renderer: function(value
, metaData
, rec
) {
242 if (rec
.data
.type
!== 'osd') {
245 return PVE
.Utils
.render_size(value
);
252 header
: gettext('Latency (ms)'),
256 dataIndex
: 'apply_latency_ms',
258 renderer: function(value
, metaData
, rec
) {
259 if (rec
.data
.type
!== 'osd') {
268 dataIndex
: 'commit_latency_ms',
270 renderer: function(value
, metaData
, rec
) {
271 if (rec
.data
.type
!== 'osd') {
281 initComponent: function() {
282 /*jslint confusion: true */
285 // we expect noout to be not set by default
289 var nodename
= me
.pveSelNode
.data
.node
;
291 throw "no node name specified";
294 var sm
= Ext
.create('Ext.selection.TreeModel', {});
296 var set_button_status
; // defined later
298 var reload = function() {
299 Proxmox
.Utils
.API2Request({
300 url
: "/nodes/" + nodename
+ "/ceph/osd",
303 failure: function(response
, opts
) {
304 var msg
= response
.htmlStatus
;
305 PVE
.Utils
.showCephInstallOrMask(me
, msg
, me
.pveSelNode
.data
.node
,
307 me
.mon(win
, 'cephInstallWindowClosed', function(){
313 success: function(response
, opts
) {
314 var data
= response
.result
.data
;
316 me
.setRootNode(data
.root
);
318 // extract noout flag
319 if (data
.flags
&& data
.flags
.search(/noout/) !== -1) {
325 me
.versions
= data
.versions
;
326 // extract max version
327 Object
.values(data
.versions
|| {}).forEach(function(version
) {
328 if (PVE
.Utils
.compare_ceph_versions(version
, me
.maxversion
) > 0) {
329 me
.maxversion
= version
;
337 var osd_cmd = function(cmd
) {
338 var rec
= sm
.getSelection()[0];
339 if (!(rec
&& (rec
.data
.id
>= 0) && rec
.data
.host
)) {
342 Proxmox
.Utils
.API2Request({
343 url
: "/nodes/" + rec
.data
.host
+ "/ceph/osd/" +
344 rec
.data
.id
+ '/' + cmd
,
348 failure: function(response
, opts
) {
349 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
354 var service_cmd = function(cmd
) {
355 var rec
= sm
.getSelection()[0];
356 if (!(rec
&& rec
.data
.name
&& rec
.data
.host
)) {
359 Proxmox
.Utils
.API2Request({
360 url
: "/nodes/" + rec
.data
.host
+ "/ceph/" + cmd
,
361 params
: { service
: rec
.data
.name
},
364 success: function(response
, options
) {
365 var upid
= response
.result
.data
;
366 var win
= Ext
.create('Proxmox.window.TaskProgress', { upid
: upid
});
368 me
.mon(win
, 'close', reload
, me
);
370 failure: function(response
, opts
) {
371 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
376 var create_btn
= new Proxmox
.button
.Button({
377 text
: gettext('Create') + ': OSD',
378 handler: function() {
379 var rec
= sm
.getSelection()[0];
381 var win
= Ext
.create('PVE.CephCreateOsd', {
385 me
.mon(win
, 'close', reload
, me
);
389 var start_btn
= new Ext
.Button({
390 text
: gettext('Start'),
392 handler: function(){ service_cmd('start'); }
395 var stop_btn
= new Ext
.Button({
396 text
: gettext('Stop'),
398 handler: function(){ service_cmd('stop'); }
401 var restart_btn
= new Ext
.Button({
402 text
: gettext('Restart'),
404 handler: function(){ service_cmd('restart'); }
407 var osd_out_btn
= new Ext
.Button({
410 handler: function(){ osd_cmd('out'); }
413 var osd_in_btn
= new Ext
.Button({
416 handler: function(){ osd_cmd('in'); }
419 var remove_btn
= new Ext
.Button({
420 text
: gettext('Destroy'),
423 var rec
= sm
.getSelection()[0];
424 if (!(rec
&& (rec
.data
.id
>= 0) && rec
.data
.host
)) {
428 var win
= Ext
.create('PVE.CephRemoveOsd', {
429 nodename
: rec
.data
.host
,
433 me
.mon(win
, 'close', reload
, me
);
437 var noout_btn
= new Ext
.Button({
438 text
: gettext('Set noout'),
439 handler: function() {
440 Proxmox
.Utils
.API2Request({
441 url
: "/nodes/" + nodename
+ "/ceph/flags/noout",
443 method
: noout
? 'DELETE' : 'POST',
444 failure: function(response
, opts
) {
445 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
452 var osd_label
= new Ext
.toolbar
.TextItem({
460 gettext('No OSD selected'),
465 set_button_status = function() {
466 var rec
= sm
.getSelection()[0];
467 noout_btn
.setText(noout
?gettext('Unset noout'):gettext('Set noout'));
470 start_btn
.setDisabled(true);
471 stop_btn
.setDisabled(true);
472 restart_btn
.setDisabled(true);
473 remove_btn
.setDisabled(true);
474 osd_out_btn
.setDisabled(true);
475 osd_in_btn
.setDisabled(true);
479 var isOsd
= (rec
.data
.host
&& (rec
.data
.type
=== 'osd') && (rec
.data
.id
>= 0));
481 start_btn
.setDisabled(!(isOsd
&& (rec
.data
.status
!== 'up')));
482 stop_btn
.setDisabled(!(isOsd
&& (rec
.data
.status
!== 'down')));
483 restart_btn
.setDisabled(!(isOsd
&& (rec
.data
.status
!== 'down')));
484 remove_btn
.setDisabled(!(isOsd
&& (rec
.data
.status
=== 'down')));
486 osd_out_btn
.setDisabled(!(isOsd
&& rec
.data
['in']));
487 osd_in_btn
.setDisabled(!(isOsd
&& !rec
.data
['in']));
489 osd_label
.update(isOsd
?{osd
:rec
.data
.name
}:undefined);
492 sm
.on('selectionchange', set_button_status
);
494 var reload_btn
= new Ext
.Button({
495 text
: gettext('Reload'),
500 tbar
: [ create_btn
, reload_btn
, noout_btn
, '->', osd_label
, start_btn
, stop_btn
, restart_btn
, osd_out_btn
, osd_in_btn
, remove_btn
],
503 fields
: ['name', 'type', 'status', 'host', 'in', 'id' ,
504 { type
: 'number', name
: 'reweight' },
505 { type
: 'number', name
: 'percent_used' },
506 { type
: 'integer', name
: 'bytes_used' },
507 { type
: 'integer', name
: 'total_space' },
508 { type
: 'integer', name
: 'apply_latency_ms' },
509 { type
: 'integer', name
: 'commit_latency_ms' },
510 { type
: 'string', name
: 'device_class' },
511 { type
: 'string', name
: 'osdtype' },
512 { type
: 'string', name
: 'blfsdev' },
513 { type
: 'string', name
: 'dbdev' },
514 { type
: 'string', name
: 'waldev' },
515 { type
: 'string', name
: 'version', calculate: function(data
) {
516 return PVE
.Utils
.parse_ceph_version(data
);
518 { type
: 'string', name
: 'iconCls', calculate: function(data
) {
519 var iconCls
= 'fa x-fa-tree fa-';
522 iconCls
+= 'building';
535 { type
: 'number', name
: 'crush_weight' }],
539 activate: function() {