]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/ceph/OSD.js
1 Ext
.define('PVE.CephCreateOsd', {
2 extend
: 'Proxmox.window.Edit',
3 xtype
: 'pveCephCreateOsd',
9 onlineHelp
: 'pve_ceph_osds',
11 initComponent : function() {
15 throw "no node name specified";
21 url
: "/nodes/" + me
.nodename
+ "/ceph/osd",
26 onGetValues: function(values
) {
27 Object
.keys(values
|| {}).forEach(function(name
) {
28 if (values
[name
] === '') {
37 xtype
: 'pveDiskSelector',
39 nodename
: me
.nodename
,
41 fieldLabel
: gettext('Disk'),
47 xtype
: 'pveDiskSelector',
49 nodename
: me
.nodename
,
50 diskType
: 'journal_disks',
51 fieldLabel
: gettext('DB Disk'),
55 emptyText
: 'use OSD disk',
57 change: function(field
, val
) {
58 me
.down('field[name=db_size]').setDisabled(!val
);
65 fieldLabel
: gettext('DB size') + ' (GiB)',
71 emptyText
: gettext('Automatic')
76 xtype
: 'proxmoxcheckbox',
78 fieldLabel
: gettext('Encrypt OSD')
83 xtype
: 'pveDiskSelector',
85 nodename
: me
.nodename
,
86 diskType
: 'journal_disks',
87 fieldLabel
: gettext('WAL Disk'),
91 emptyText
: 'use OSD/DB disk',
93 change: function(field
, val
) {
94 me
.down('field[name=wal_size]').setDisabled(!val
);
101 fieldLabel
: gettext('WAL size') + ' (GiB)',
107 emptyText
: gettext('Automatic')
112 xtype
: 'displayfield',
115 value
: 'Note: Ceph is not compatible with disks backed by a hardware ' +
116 'RAID controller. For details see ' +
117 '<a target="_blank" href="' + Proxmox
.Utils
.get_help_link('chapter_pveceph') + '">the reference documentation</a>.',
126 Ext
.define('PVE.CephRemoveOsd', {
127 extend
: 'Proxmox.window.Edit',
128 alias
: ['widget.pveCephRemoveOsd'],
136 xtype
: 'proxmoxcheckbox',
140 fieldLabel
: gettext('Cleanup Disks')
143 initComponent : function() {
148 throw "no node name specified";
150 if (me
.osdid
=== undefined || me
.osdid
< 0) {
151 throw "no osdid specified";
156 me
.title
= gettext('Destroy') + ': Ceph OSD osd.' + me
.osdid
.toString();
159 url
: "/nodes/" + me
.nodename
+ "/ceph/osd/" + me
.osdid
.toString()
166 Ext
.define('PVE.node.CephOsdTree', {
167 extend
: 'Ext.tree.Panel',
168 alias
: ['widget.pveNodeCephOsdTree'],
169 onlineHelp
: 'chapter_pveceph',
188 xclass
: 'Ext.app.ViewController',
191 var me
= this.getView();
192 var vm
= this.getViewModel();
193 var nodename
= vm
.get('nodename');
194 var sm
= me
.getSelectionModel();
195 Proxmox
.Utils
.API2Request({
196 url
: "/nodes/" + nodename
+ "/ceph/osd",
199 failure: function(response
, opts
) {
200 var msg
= response
.htmlStatus
;
201 PVE
.Utils
.showCephInstallOrMask(me
, msg
, nodename
,
203 me
.mon(win
, 'cephInstallWindowClosed', this.reload
);
207 success: function(response
, opts
) {
208 var data
= response
.result
.data
;
209 var selected
= me
.getSelection();
211 if (selected
.length
) {
212 name
= selected
[0].data
.name
;
214 vm
.set('versions', data
.versions
);
215 // extract max version
216 var maxversion
= vm
.get('maxversion');
217 Object
.values(data
.versions
|| {}).forEach(function(version
) {
218 if (PVE
.Utils
.compare_ceph_versions(version
, maxversion
) > 0) {
219 maxversion
= version
;
222 vm
.set('maxversion', maxversion
);
224 me
.setRootNode(data
.root
);
227 var node
= me
.getRootNode().findChild('name', name
, true);
229 me
.setSelection([node
]);
233 var flags
= data
.flags
.split(',');
234 vm
.set('flags', flags
);
235 var noout
= flags
.includes('noout');
236 me
.down('#nooutBtn').setText(noout
? gettext("Unset noout") : gettext("Set noout"));
241 osd_cmd: function(comp
) {
243 var vm
= this.getViewModel();
245 var params
= comp
.params
|| {};
246 var osdid
= vm
.get('osdid');
248 var doRequest = function() {
249 Proxmox
.Utils
.API2Request({
250 url
: "/nodes/" + vm
.get('osdhost') + "/ceph/osd/" + osdid
+ '/' + cmd
,
251 waitMsgTarget
: me
.getView(),
254 success
: () => { me
.reload(); },
255 failure: function(response
, opts
) {
256 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
261 if (cmd
=== 'scrub') {
262 Ext
.MessageBox
.defaultButton
= params
.deep
=== 1 ? 2 : 1;
264 title
: gettext('Confirm'),
265 icon
: params
.deep
=== 1 ? Ext
.Msg
.WARNING
: Ext
.Msg
.QUESTION
,
266 msg
: params
.deep
!== 1 ?
267 Ext
.String
.format(gettext("Scrub OSD.{0}"), osdid
) :
268 Ext
.String
.format(gettext("Deep Scrub OSD.{0}"), osdid
) +
269 "<br>Caution: This can reduce performance while it is running.",
270 buttons
: Ext
.Msg
.YESNO
,
271 callback: function(btn
) {
283 create_osd: function() {
285 var vm
= this.getViewModel();
286 Ext
.create('PVE.CephCreateOsd', {
287 nodename
: vm
.get('nodename'),
288 taskDone
: () => { me
.reload(); }
292 destroy_osd: function() {
294 var vm
= this.getViewModel();
295 Ext
.create('PVE.CephRemoveOsd', {
296 nodename
: vm
.get('osdhost'),
297 osdid
: vm
.get('osdid'),
298 taskDone
: () => { me
.reload(); }
302 set_flag: function() {
304 var vm
= this.getViewModel();
305 var flags
= vm
.get('flags');
306 Proxmox
.Utils
.API2Request({
307 url
: "/nodes/" + vm
.get('nodename') + "/ceph/flags/noout",
308 waitMsgTarget
: me
.getView(),
309 method
: flags
.includes('noout') ? 'DELETE' : 'POST',
310 failure: function(response
, opts
) {
311 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
313 success
: () => { me
.reload(); }
317 service_cmd: function(comp
) {
319 var vm
= this.getViewModel();
320 var cmd
= comp
.cmd
|| comp
;
321 Proxmox
.Utils
.API2Request({
322 url
: "/nodes/" + vm
.get('osdhost') + "/ceph/" + cmd
,
323 params
: { service
: "osd." + vm
.get('osdid') },
324 waitMsgTarget
: me
.getView(),
326 success: function(response
, options
) {
327 var upid
= response
.result
.data
;
328 var win
= Ext
.create('Proxmox.window.TaskProgress', {
330 taskDone
: () => { me
.reload(); }
334 failure: function(response
, opts
) {
335 Ext
.Msg
.alert(gettext('Error'), response
.htmlStatus
);
340 set_selection_status: function(tp
, selection
) {
341 if (selection
.length
< 1) {
344 var rec
= selection
[0];
345 var vm
= this.getViewModel();
347 var isOsd
= (rec
.data
.host
&& (rec
.data
.type
=== 'osd') && (rec
.data
.id
>= 0));
349 vm
.set('isOsd', isOsd
);
350 vm
.set('downOsd', isOsd
&& rec
.data
.status
=== 'down');
351 vm
.set('upOsd', isOsd
&& rec
.data
.status
!== 'down');
352 vm
.set('inOsd', isOsd
&& rec
.data
.in);
353 vm
.set('outOsd', isOsd
&& !rec
.data
.in);
354 vm
.set('osdid', isOsd
? rec
.data
.id
: undefined);
355 vm
.set('osdhost', isOsd
? rec
.data
.host
: undefined);
359 render_status: function(value
, metaData
, rec
) {
363 var inout
= rec
.data
['in'] ? 'in' : 'out';
364 var updownicon
= value
=== 'up' ? 'good fa-arrow-circle-up' :
365 'critical fa-arrow-circle-down';
367 var inouticon
= rec
.data
['in'] ? 'good fa-circle' :
368 'warning fa-circle-o';
370 var text
= value
+ ' <i class="fa ' + updownicon
+ '"></i> / ' +
371 inout
+ ' <i class="fa ' + inouticon
+ '"></i>';
376 render_wal: function(value
, metaData
, rec
) {
378 rec
.data
.osdtype
=== 'bluestore' &&
379 rec
.data
.type
=== 'osd') {
385 render_version: function(value
, metadata
, rec
) {
386 var vm
= this.getViewModel();
387 var versions
= vm
.get('versions');
389 var version
= value
|| "";
390 if (value
&& value
!= vm
.get('maxversion')) {
391 icon
= PVE
.Utils
.get_ceph_icon_html('HEALTH_OLD');
394 if (!value
&& rec
.data
.type
== 'host') {
395 version
= versions
[rec
.data
.name
] || Proxmox
.Utils
.unknownText
;
398 return icon
+ version
;
401 render_osd_val: function(value
, metaData
, rec
) {
402 return (rec
.data
.type
=== 'osd') ? value
: '';
405 render_osd_size: function(value
, metaData
, rec
) {
406 return this.render_osd_val(PVE
.Utils
.render_size(value
), metaData
, rec
);
411 selectionchange
: 'set_selection_status'
415 init: function(view
) {
417 var vm
= this.getViewModel();
419 if (!view
.pveSelNode
.data
.node
) {
420 throw "no node name specified";
423 vm
.set('nodename', view
.pveSelNode
.data
.node
);
431 stateId
: 'grid-ceph-osd',
449 text
: gettext("Class"),
450 dataIndex
: 'device_class',
456 dataIndex
: 'osdtype',
461 text
: "Bluestore Device",
462 dataIndex
: 'blfsdev',
478 renderer
: 'render_wal',
486 renderer
: 'render_status',
490 text
: gettext('Version'),
491 dataIndex
: 'version',
492 renderer
: 'render_version'
496 dataIndex
: 'crush_weight',
498 renderer
: 'render_osd_val',
503 dataIndex
: 'reweight',
505 renderer
: 'render_osd_val',
509 header
: gettext('Used'),
513 dataIndex
: 'percent_used',
515 renderer: function(value
, metaData
, rec
) {
516 if (rec
.data
.type
!== 'osd') {
519 return Ext
.util
.Format
.number(value
, '0.00');
524 text
: gettext('Total'),
525 dataIndex
: 'total_space',
527 renderer
: 'render_osd_size',
533 header
: gettext('Latency (ms)'),
537 dataIndex
: 'apply_latency_ms',
539 renderer
: 'render_osd_val',
544 dataIndex
: 'commit_latency_ms',
546 renderer
: 'render_osd_val',
557 text
: gettext('Reload'),
558 iconCls
: 'fa fa-refresh',
562 text
: gettext('Create') + ': OSD',
563 handler
: 'create_osd',
566 text
: gettext('Set noout'),
585 gettext('No OSD selected'),
590 text
: gettext('Start'),
591 iconCls
: 'fa fa-play',
594 disabled
: '{!downOsd}'
597 handler
: 'service_cmd'
600 text
: gettext('Stop'),
601 iconCls
: 'fa fa-stop',
607 handler
: 'service_cmd'
610 text
: gettext('Restart'),
611 iconCls
: 'fa fa-refresh',
617 handler
: 'service_cmd'
622 iconCls
: 'fa fa-circle-o',
632 iconCls
: 'fa fa-circle',
635 disabled
: '{!outOsd}'
642 text
: gettext('Actions'),
643 iconCls
: 'fa fa-bars',
650 text
: gettext('Scrub'),
651 iconCls
: 'fa fa-shower',
656 text
: gettext('Deep Scrub'),
657 iconCls
: 'fa fa-bath',
665 text
: gettext('Destroy'),
667 iconCls
: 'fa fa-fw fa-trash-o',
669 disabled
: '{!downOsd}'
671 handler
: 'destroy_osd'
679 'name', 'type', 'status', 'host', 'in', 'id' ,
680 { type
: 'number', name
: 'reweight' },
681 { type
: 'number', name
: 'percent_used' },
682 { type
: 'integer', name
: 'bytes_used' },
683 { type
: 'integer', name
: 'total_space' },
684 { type
: 'integer', name
: 'apply_latency_ms' },
685 { type
: 'integer', name
: 'commit_latency_ms' },
686 { type
: 'string', name
: 'device_class' },
687 { type
: 'string', name
: 'osdtype' },
688 { type
: 'string', name
: 'blfsdev' },
689 { type
: 'string', name
: 'dbdev' },
690 { type
: 'string', name
: 'waldev' },
691 { type
: 'string', name
: 'version', calculate: function(data
) {
692 return PVE
.Utils
.parse_ceph_version(data
);
694 { type
: 'string', name
: 'iconCls', calculate: function(data
) {
700 return 'fa x-fa-tree ' + iconMap
[data
.type
];
702 { type
: 'number', name
: 'crush_weight' }