]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/node/ZFS.js
1 Ext
.define('PVE.node.CreateZFS', {
2 extend
: 'Proxmox.window.Edit',
9 onlineHelp
: 'chapter_zfs',
13 initComponent: function() {
17 throw "no node name specified";
22 var update_disklist = function() {
23 var grid
= me
.down('#disklist');
24 var disks
= grid
.getSelection();
27 disks
.sort(function(a
, b
) {
28 var aorder
= a
.get('order') || 0;
29 var border
= b
.get('order') || 0;
30 return aorder
- border
;
33 disks
.forEach(function(disk
) {
34 val
.push(disk
.get('devpath'));
37 me
.down('field[name=devices]').setValue(val
.join(','));
41 url
: '/nodes/' + me
.nodename
+ '/disks/zfs',
46 onGetValues: function(values
) {
57 xtype
: 'proxmoxtextfield',
59 fieldLabel
: gettext('Name'),
63 xtype
: 'proxmoxcheckbox',
65 fieldLabel
: gettext('Add Storage'),
71 xtype
: 'proxmoxKVComboBox',
72 fieldLabel
: gettext('RAID Level'),
76 ['single', gettext('Single Disk')],
85 xtype
: 'proxmoxKVComboBox',
86 fieldLabel
: gettext('Compression'),
99 xtype
: 'proxmoxintegerfield',
100 fieldLabel
: gettext('ashift'),
111 emptyText
: gettext('No Disks unused'),
113 selModel
: 'checkboxmodel',
115 selectionchange
: update_disklist
,
120 url
: '/api2/json/nodes/' + me
.nodename
+ '/disks/list?type=unused',
125 text
: gettext('Device'),
126 dataIndex
: 'devpath',
130 text
: gettext('Model'),
135 text
: gettext('Serial'),
140 text
: gettext('Size'),
142 renderer
: PVE
.Utils
.render_size
,
146 header
: gettext('Order'),
147 xtype
: 'widgetcolumn',
152 xtype
: 'proxmoxintegerfield',
156 change: function(numberfield
, value
, old_value
) {
157 var record
= numberfield
.getWidgetRecord();
158 record
.set('order', value
);
159 update_disklist(record
);
169 xtype
: 'displayfield',
172 value
: 'Note: ZFS is not compatible with disks backed by a hardware ' +
173 'RAID controller. For details see ' +
174 '<a target="_blank" href="' + Proxmox
.Utils
.get_help_link('chapter_zfs') + '">the reference documentation</a>.',
180 me
.down('#disklist').getStore().load();
184 Ext
.define('PVE.node.ZFSDevices', {
185 extend
: 'Ext.tree.Panel',
186 xtype
: 'pveZFSDevices',
188 stateId
: 'grid-node-zfsstatus',
192 text
: gettext('Name'),
197 text
: gettext('Health'),
198 renderer
: PVE
.Utils
.render_zfs_health
,
214 text
: gettext('Message'),
223 var sm
= me
.getSelectionModel();
224 Proxmox
.Utils
.API2Request({
225 url
: "/nodes/" + me
.nodename
+ "/disks/zfs/" + me
.zpool
,
228 failure: function(response
, opts
) {
229 Proxmox
.Utils
.setErrorMask(me
, response
.htmlStatus
);
231 success: function(response
, opts
) {
233 me
.setRootNode(response
.result
.data
);
239 initComponent: function() {
243 throw "no node name specified";
247 throw "no zpool specified";
250 var sm
= Ext
.create('Ext.selection.TreeModel', {});
254 fields
: ['name', 'status',
258 calculate: function(data
) {
259 var txt
= 'fa x-fa-tree fa-';
261 return txt
+ 'hdd-o';
275 Ext
.define('PVE.node.ZFSStatus', {
276 extend
: 'Proxmox.grid.ObjectGrid',
277 xtype
: 'pveZFSStatus',
281 initComponent: function() {
285 throw "no node name specified";
289 throw "no zpool specified";
292 me
.url
= "/api2/extjs/nodes/" + me
.nodename
+ "/disks/zfs/" + me
.zpool
;
296 header
: gettext('Scan'),
297 defaultValue
: gettext('No Data'),
300 header
: gettext('Status'),
303 header
: gettext('Action'),
306 header
: gettext('Errors'),
315 Ext
.define('PVE.node.ZFSList', {
316 extend
: 'Ext.grid.Panel',
320 stateId
: 'grid-node-zfs',
323 text
: gettext('Name'),
328 header
: gettext('Size'),
329 renderer
: Proxmox
.Utils
.format_size
,
333 header
: gettext('Free'),
334 renderer
: Proxmox
.Utils
.format_size
,
338 header
: gettext('Allocated'),
339 renderer
: Proxmox
.Utils
.format_size
,
343 header
: gettext('Fragmentation'),
344 renderer: function(value
) {
345 return value
.toString() + '%';
350 header
: gettext('Health'),
351 renderer
: PVE
.Utils
.render_zfs_health
,
355 header
: gettext('Deduplication'),
357 renderer: function(value
) {
358 return value
.toFixed(2).toString() + 'x';
369 text
: gettext('Reload'),
370 iconCls
: 'fa fa-refresh',
371 handler: function() {
372 var me
= this.up('panel');
377 text
: gettext('Create') + ': ZFS',
378 handler: function() {
379 var me
= this.up('panel');
380 var win
= Ext
.create('PVE.node.CreateZFS', {
381 nodename
: me
.nodename
,
383 win
.on('destroy', function() { me
.reload(); });
387 text
: gettext('Detail'),
390 handler: function() {
391 var me
= this.up('panel');
392 var selection
= me
.getSelection();
393 if (selection
.length
< 1) {
396 me
.show_detail(selection
[0].get('name'));
401 show_detail: function(zpool
) {
404 var detailsgrid
= Ext
.create('PVE.node.ZFSStatus', {
406 nodename
: me
.nodename
,
411 var devicetree
= Ext
.create('PVE.node.ZFSDevices', {
412 title
: gettext('Devices'),
413 nodename
: me
.nodename
,
419 var win
= Ext
.create('Ext.window.Window', {
425 title
: gettext('Status') + ': ' + zpool
,
433 items
: [detailsgrid
, devicetree
],
435 text
: gettext('Reload'),
436 iconCls
: 'fa fa-refresh',
437 handler: function() {
439 detailsgrid
.reload();
446 set_button_status: function() {
448 var selection
= me
.getSelection();
449 me
.down('#detailbtn').setDisabled(selection
.length
=== 0);
459 activate: function() {
463 selectionchange: function() {
464 this.set_button_status();
466 itemdblclick: function(grid
, record
) {
468 me
.show_detail(record
.get('name'));
472 initComponent: function() {
475 me
.nodename
= me
.pveSelNode
.data
.node
;
477 throw "no node name specified";
482 fields
: ['name', 'size', 'free', 'alloc', 'dedup', 'frag', 'health'],
485 url
: "/api2/json/nodes/" + me
.nodename
+ '/disks/zfs',
493 Proxmox
.Utils
.monStoreErrors(me
, me
.getStore(), true);