]>
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'),
299 header
: gettext('Status'),
302 header
: gettext('Action'),
305 header
: gettext('Errors'),
314 Ext
.define('PVE.node.ZFSList', {
315 extend
: 'Ext.grid.Panel',
319 stateId
: 'grid-node-zfs',
322 text
: gettext('Name'),
327 header
: gettext('Size'),
328 renderer
: Proxmox
.Utils
.format_size
,
332 header
: gettext('Free'),
333 renderer
: Proxmox
.Utils
.format_size
,
337 header
: gettext('Allocated'),
338 renderer
: Proxmox
.Utils
.format_size
,
342 header
: gettext('Fragmentation'),
343 renderer: function(value
) {
344 return value
.toString() + '%';
349 header
: gettext('Health'),
350 renderer
: PVE
.Utils
.render_zfs_health
,
354 header
: gettext('Deduplication'),
356 renderer: function(value
) {
357 return value
.toFixed(2).toString() + 'x';
368 text
: gettext('Reload'),
369 iconCls
: 'fa fa-refresh',
370 handler: function() {
371 var me
= this.up('panel');
376 text
: gettext('Create') + ': ZFS',
377 handler: function() {
378 var me
= this.up('panel');
379 var win
= Ext
.create('PVE.node.CreateZFS', {
380 nodename
: me
.nodename
,
382 win
.on('destroy', function() { me
.reload(); });
386 text
: gettext('Detail'),
389 handler: function() {
390 var me
= this.up('panel');
391 var selection
= me
.getSelection();
392 if (selection
.length
< 1) {
395 me
.show_detail(selection
[0].get('name'));
400 show_detail: function(zpool
) {
403 var detailsgrid
= Ext
.create('PVE.node.ZFSStatus', {
405 nodename
: me
.nodename
,
410 var devicetree
= Ext
.create('PVE.node.ZFSDevices', {
411 title
: gettext('Devices'),
412 nodename
: me
.nodename
,
418 var win
= Ext
.create('Ext.window.Window', {
424 title
: gettext('Status') + ': ' + zpool
,
432 items
: [detailsgrid
, devicetree
],
434 text
: gettext('Reload'),
435 iconCls
: 'fa fa-refresh',
436 handler: function() {
438 detailsgrid
.reload();
445 set_button_status: function() {
447 var selection
= me
.getSelection();
448 me
.down('#detailbtn').setDisabled(selection
.length
=== 0);
458 activate: function() {
462 selectionchange: function() {
463 this.set_button_status();
465 itemdblclick: function(grid
, record
) {
467 me
.show_detail(record
.get('name'));
471 initComponent: function() {
474 me
.nodename
= me
.pveSelNode
.data
.node
;
476 throw "no node name specified";
481 fields
: ['name', 'size', 'free', 'alloc', 'dedup', 'frag', 'health'],
484 url
: "/api2/json/nodes/" + me
.nodename
+ '/disks/zfs',
492 Proxmox
.Utils
.monStoreErrors(me
, me
.getStore(), true);