]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/node/ZFS.js
1 /*jslint confusion: true*/
2 Ext
.define('PVE.node.CreateZFS', {
3 extend
: 'Proxmox.window.Edit',
10 onlineHelp
: 'chapter_zfs',
12 initComponent : function() {
16 throw "no node name specified";
21 var update_disklist = function() {
22 var grid
= me
.down('#disklist');
23 var disks
= grid
.getSelection();
26 disks
.sort(function(a
,b
) {
27 var aorder
= a
.get('order') || 0;
28 var border
= b
.get('order') || 0;
29 return (aorder
- border
);
32 disks
.forEach(function(disk
) {
33 val
.push(disk
.get('devpath'));
36 me
.down('field[name=devices]').setValue(val
.join(','));
40 url
: '/nodes/' + me
.nodename
+ '/disks/zfs',
45 onGetValues: function(values
) {
56 xtype
: 'proxmoxtextfield',
58 fieldLabel
: gettext('Name'),
62 xtype
: 'proxmoxcheckbox',
64 fieldLabel
: gettext('Add Storage'),
70 xtype
: 'proxmoxKVComboBox',
71 fieldLabel
: gettext('RAID Level'),
75 ['single', gettext('Single Disk')],
84 xtype
: 'proxmoxKVComboBox',
85 fieldLabel
: gettext('Compression'),
98 xtype
: 'proxmoxintegerfield',
99 fieldLabel
: gettext('ashift'),
110 emptyText
: gettext('No Disks unused'),
112 selModel
: 'checkboxmodel',
114 selectionchange
: update_disklist
119 url
: '/api2/json/nodes/' + me
.nodename
+ '/disks/list?type=unused'
124 text
: gettext('Device'),
125 dataIndex
: 'devpath',
129 text
: gettext('Serial'),
133 text
: gettext('Size'),
135 renderer
: PVE
.Utils
.render_size
138 header
: gettext('Order'),
139 xtype
: 'widgetcolumn',
143 xtype
: 'proxmoxintegerfield',
147 change: function(numberfield
, value
, old_value
) {
148 var record
= numberfield
.getWidgetRecord();
149 record
.set('order', value
);
150 update_disklist(record
);
160 xtype
: 'displayfield',
163 value
: 'Note: ZFS is not compatible with disks backed by a hardware ' +
164 'RAID controller. For details see ' +
165 '<a target="_blank" href="' + Proxmox
.Utils
.get_help_link('chapter_zfs') + '">the reference documentation</a>.',
171 me
.down('#disklist').getStore().load();
175 Ext
.define('PVE.node.ZFSDevices', {
176 extend
: 'Ext.tree.Panel',
177 xtype
: 'pveZFSDevices',
179 stateId
: 'grid-node-zfsstatus',
183 text
: gettext('Name'),
188 text
: gettext('Health'),
189 renderer
: PVE
.Utils
.render_zfs_health
,
205 text
: gettext('Message'),
214 var sm
= me
.getSelectionModel();
215 Proxmox
.Utils
.API2Request({
216 url
: "/nodes/" + me
.nodename
+ "/disks/zfs/" + me
.zpool
,
219 failure: function(response
, opts
) {
220 Proxmox
.Utils
.setErrorMask(me
, response
.htmlStatus
);
222 success: function(response
, opts
) {
224 me
.setRootNode(response
.result
.data
);
230 initComponent: function() {
231 /*jslint confusion: true */
235 throw "no node name specified";
239 throw "no zpool specified";
242 var sm
= Ext
.create('Ext.selection.TreeModel', {});
246 fields
: ['name', 'status',
250 calculate: function(data
) {
251 var txt
= 'fa x-fa-tree fa-';
253 return txt
+ 'hdd-o';
267 Ext
.define('PVE.node.ZFSStatus', {
268 extend
: 'Proxmox.grid.ObjectGrid',
269 xtype
: 'pveZFSStatus',
273 initComponent: function() {
274 /*jslint confusion: true */
278 throw "no node name specified";
282 throw "no zpool specified";
285 me
.url
= "/api2/extjs/nodes/" + me
.nodename
+ "/disks/zfs/" + me
.zpool
;
289 header
: gettext('Scan')
292 header
: gettext('Status')
295 header
: gettext('Action')
298 header
: gettext('Errors')
307 Ext
.define('PVE.node.ZFSList', {
308 extend
: 'Ext.grid.Panel',
312 stateId
: 'grid-node-zfs',
315 text
: gettext('Name'),
320 header
: gettext('Size'),
321 renderer
: Proxmox
.Utils
.format_size
,
325 header
: gettext('Free'),
326 renderer
: Proxmox
.Utils
.format_size
,
330 header
: gettext('Allocated'),
331 renderer
: Proxmox
.Utils
.format_size
,
335 header
: gettext('Fragmentation'),
336 renderer: function(value
) {
337 return value
.toString() + '%';
342 header
: gettext('Health'),
343 renderer
: PVE
.Utils
.render_zfs_health
,
347 header
: gettext('Deduplication'),
349 renderer: function(value
) {
350 return value
.toFixed(2).toString() + 'x';
361 text
: gettext('Reload'),
362 iconCls
: 'fa fa-refresh',
363 handler: function() {
364 var me
= this.up('panel');
369 text
: gettext('Create') + ': ZFS',
370 handler: function() {
371 var me
= this.up('panel');
372 var win
= Ext
.create('PVE.node.CreateZFS', {
373 nodename
: me
.nodename
375 win
.on('destroy', function() { me
.reload(); });
379 text
: gettext('Detail'),
382 handler: function() {
383 var me
= this.up('panel');
384 var selection
= me
.getSelection();
385 if (selection
.length
< 1) {
388 me
.show_detail(selection
[0].get('name'));
393 show_detail: function(zpool
) {
396 var detailsgrid
= Ext
.create('PVE.node.ZFSStatus', {
398 nodename
: me
.nodename
,
403 var devicetree
= Ext
.create('PVE.node.ZFSDevices', {
404 title
: gettext('Devices'),
405 nodename
: me
.nodename
,
411 var win
= Ext
.create('Ext.window.Window', {
417 title
: gettext('Status') + ': ' + zpool
,
425 items
: [detailsgrid
, devicetree
],
427 text
: gettext('Reload'),
428 iconCls
: 'fa fa-refresh',
429 handler: function() {
432 detailsgrid
.reload();
439 set_button_status: function() {
441 var selection
= me
.getSelection();
442 me
.down('#detailbtn').setDisabled(selection
.length
=== 0);
452 activate: function() {
456 selectionchange: function() {
457 this.set_button_status();
459 itemdblclick: function(grid
, record
) {
461 me
.show_detail(record
.get('name'));
465 initComponent: function() {
466 /*jslint confusion: true */
469 me
.nodename
= me
.pveSelNode
.data
.node
;
471 throw "no node name specified";
476 fields
: ['name', 'size', 'free', 'alloc', 'dedup', 'frag', 'health'],
479 url
: "/api2/json/nodes/" + me
.nodename
+ '/disks/zfs'
487 Proxmox
.Utils
.monStoreErrors(me
, me
.getStore(), true);