]>
git.proxmox.com Git - pve-manager.git/blob - www/manager6/node/ZFS.js
1 Ext
.define('PVE.node.CreateZFS', {
2 extend
: 'Proxmox.window.Edit',
5 onlineHelp
: 'chapter_zfs',
12 initComponent: function() {
16 throw "no node name specified";
19 let update_disklist = function() {
20 let grid
= me
.down('#disklist');
21 let disks
= grid
.getSelection();
23 disks
.sort(function(a
, b
) {
24 let aOrder
= a
.get('order') || 0;
25 let bOrder
= b
.get('order') || 0;
26 return aOrder
- bOrder
;
29 let selectedDevices
= disks
.map(disk
=> disk
.get('devpath')).join(';');
31 me
.down('field[name=devices]').setValue(selectedDevices
);
35 url
: `/nodes/${me.nodename}/disks/zfs`,
40 onGetValues
: values
=> values
, // FIXME leftover?
49 xtype
: 'proxmoxtextfield',
51 fieldLabel
: gettext('Name'),
55 xtype
: 'proxmoxcheckbox',
57 fieldLabel
: gettext('Add Storage'),
63 xtype
: 'proxmoxKVComboBox',
64 fieldLabel
: gettext('RAID Level'),
68 ['single', gettext('Single Disk')],
77 xtype
: 'proxmoxKVComboBox',
78 fieldLabel
: gettext('Compression'),
92 xtype
: 'proxmoxintegerfield',
93 fieldLabel
: gettext('ashift'),
104 emptyText
: gettext('No Disks unused'),
106 selModel
: 'checkboxmodel',
108 selectionchange
: update_disklist
,
113 url
: `/api2/json/nodes/${me.nodename}/disks/list?type=unused`,
118 text
: gettext('Device'),
119 dataIndex
: 'devpath',
123 text
: gettext('Model'),
128 text
: gettext('Serial'),
133 text
: gettext('Size'),
135 renderer
: Proxmox
.Utils
.render_size
,
139 header
: gettext('Order'),
140 xtype
: 'widgetcolumn',
145 xtype
: 'proxmoxintegerfield',
149 change: function(numberfield
, value
, old_value
) {
150 let record
= numberfield
.getWidgetRecord();
151 record
.set('order', value
);
152 update_disklist(record
);
162 xtype
: 'displayfield',
165 value
: 'Note: ZFS is not compatible with disks backed by a hardware ' +
166 'RAID controller. For details see <a target="_blank" href="' +
167 Proxmox
.Utils
.get_help_link('chapter_zfs') + '">the reference documentation</a>.',
173 me
.down('#disklist').getStore().load();
177 Ext
.define('PVE.node.ZFSDevices', {
178 extend
: 'Ext.tree.Panel',
179 xtype
: 'pveZFSDevices',
182 stateId
: 'grid-node-zfsstatus',
186 text
: gettext('Name'),
191 text
: gettext('Health'),
192 renderer
: PVE
.Utils
.render_zfs_health
,
208 text
: gettext('Message'),
215 let sm
= me
.getSelectionModel();
216 Proxmox
.Utils
.API2Request({
217 url
: `/nodes/${me.nodename}/disks/zfs/${me.zpool}`,
220 failure
: (response
, opts
) => Proxmox
.Utils
.setErrorMask(me
, response
.htmlStatus
),
221 success: function(response
, opts
) {
223 me
.setRootNode(response
.result
.data
);
230 selModel
: 'treemodel',
237 calculate
: data
=> data
.leaf
? `fa x-fa-tree fa-hdd-o` : undefined,
241 initComponent: function() {
245 throw "no node name specified";
248 throw "no zpool specified";
257 Ext
.define('PVE.node.ZFSStatus', {
258 extend
: 'Proxmox.grid.ObjectGrid',
259 xtype
: 'pveZFSStatus',
263 initComponent: function() {
267 throw "no node name specified";
270 throw "no zpool specified";
273 me
.url
= `/api2/extjs/nodes/${me.nodename}/disks/zfs/${me.zpool}`;
277 header
: gettext('Scan'),
278 defaultValue
: gettext('No Data'),
281 header
: gettext('Status'),
284 header
: gettext('Action'),
287 header
: gettext('Errors'),
296 Ext
.define('PVE.node.ZFSList', {
297 extend
: 'Ext.grid.Panel',
307 xclass
: 'Ext.app.ViewController',
309 destroyPool: function() {
311 let vm
= me
.getViewModel();
312 let view
= me
.getView();
314 const pool
= vm
.get('pool');
316 if (!view
.nodename
) {
317 throw "no node name specified";
321 throw "no pool specified";
324 Ext
.create('PVE.window.SafeDestroyStorage', {
325 url
: `/nodes/${view.nodename}/disks/zfs/${pool}`,
327 taskName
: 'zfsremove',
328 taskDone
: () => { view
.reload(); },
334 stateId
: 'grid-node-zfs',
337 text
: gettext('Name'),
342 header
: gettext('Size'),
343 renderer
: Proxmox
.Utils
.format_size
,
347 header
: gettext('Free'),
348 renderer
: Proxmox
.Utils
.format_size
,
352 header
: gettext('Allocated'),
353 renderer
: Proxmox
.Utils
.format_size
,
357 header
: gettext('Fragmentation'),
358 renderer: function(value
) {
359 return value
.toString() + '%';
364 header
: gettext('Health'),
365 renderer
: PVE
.Utils
.render_zfs_health
,
369 header
: gettext('Deduplication'),
371 renderer: function(value
) {
372 return value
.toFixed(2).toString() + 'x';
383 text
: gettext('Reload'),
384 iconCls
: 'fa fa-refresh',
385 handler: function() {
386 this.up('panel').reload();
390 text
: gettext('Create') + ': ZFS',
391 handler: function() {
392 let view
= this.up('panel');
393 Ext
.create('PVE.node.CreateZFS', {
394 nodename
: view
.nodename
,
396 destroy
: () => view
.reload(),
403 text
: gettext('Detail'),
406 handler: function() {
407 let view
= this.up('panel');
408 let selection
= view
.getSelection();
409 if (selection
.length
) {
410 view
.show_detail(selection
[0].get('name'));
429 Ext
.String
.format(gettext('No {0} selected'), 'pool'),
434 text
: gettext('More'),
435 iconCls
: 'fa fa-bars',
442 text
: gettext('Destroy'),
444 iconCls
: 'fa fa-fw fa-trash-o',
445 handler
: 'destroyPool',
455 show_detail: function(zpool
) {
458 let detailsgrid
= Ext
.create('PVE.node.ZFSStatus', {
460 nodename
: me
.nodename
,
464 let devicetree
= Ext
.create('PVE.node.ZFSDevices', {
465 title
: gettext('Devices'),
466 nodename
: me
.nodename
,
471 Ext
.create('Ext.window.Window', {
477 title
: gettext('Status') + ': ' + zpool
,
492 text
: gettext('Reload'),
493 iconCls
: 'fa fa-refresh',
494 handler: function() {
496 detailsgrid
.reload();
506 set_button_status: function() {
517 activate: function() {
520 selectionchange: function(model
, selected
) {
522 let vm
= me
.getViewModel();
524 me
.down('#detailbtn').setDisabled(selected
.length
=== 0);
525 vm
.set('pool', selected
[0]?.data
.name
|| '');
527 itemdblclick: function(grid
, record
) {
528 this.show_detail(record
.get('name'));
532 initComponent: function() {
535 me
.nodename
= me
.pveSelNode
.data
.node
;
537 throw "no node name specified";
542 fields
: ['name', 'size', 'free', 'alloc', 'dedup', 'frag', 'health'],
545 url
: `/api2/json/nodes/${me.nodename}/disks/zfs`,
553 Proxmox
.Utils
.monStoreErrors(me
, me
.getStore(), true);