]>
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";
20 url
: `/nodes/${me.nodename}/disks/zfs`,
27 xtype
: 'proxmoxtextfield',
29 fieldLabel
: gettext('Name'),
33 xtype
: 'proxmoxcheckbox',
35 fieldLabel
: gettext('Add Storage'),
41 xtype
: 'proxmoxKVComboBox',
42 fieldLabel
: gettext('RAID Level'),
46 ['single', gettext('Single Disk')],
55 xtype
: 'proxmoxKVComboBox',
56 fieldLabel
: gettext('Compression'),
70 xtype
: 'proxmoxintegerfield',
71 fieldLabel
: gettext('ashift'),
80 xtype
: 'pmxMultiDiskSelector',
82 nodename
: me
.nodename
,
84 includePartitions
: true,
86 emptyText
: gettext('No Disks unused'),
92 xtype
: 'displayfield',
95 value
: 'Note: ZFS is not compatible with disks backed by a hardware ' +
96 'RAID controller. For details see <a target="_blank" href="' +
97 Proxmox
.Utils
.get_help_link('chapter_zfs') + '">the reference documentation</a>.',
106 Ext
.define('PVE.node.ZFSDevices', {
107 extend
: 'Ext.tree.Panel',
108 xtype
: 'pveZFSDevices',
111 stateId
: 'grid-node-zfsstatus',
115 text
: gettext('Name'),
120 text
: gettext('Health'),
121 renderer
: PVE
.Utils
.render_zfs_health
,
137 text
: gettext('Message'),
144 let sm
= me
.getSelectionModel();
145 Proxmox
.Utils
.API2Request({
146 url
: `/nodes/${me.nodename}/disks/zfs/${me.zpool}`,
149 failure
: (response
, opts
) => Proxmox
.Utils
.setErrorMask(me
, response
.htmlStatus
),
150 success: function(response
, opts
) {
152 me
.setRootNode(response
.result
.data
);
159 selModel
: 'treemodel',
166 calculate
: data
=> data
.leaf
? `fa x-fa-tree fa-hdd-o` : undefined,
170 initComponent: function() {
174 throw "no node name specified";
177 throw "no zpool specified";
186 Ext
.define('PVE.node.ZFSStatus', {
187 extend
: 'Proxmox.grid.ObjectGrid',
188 xtype
: 'pveZFSStatus',
192 initComponent: function() {
196 throw "no node name specified";
199 throw "no zpool specified";
202 me
.url
= `/api2/extjs/nodes/${me.nodename}/disks/zfs/${me.zpool}`;
206 header
: gettext('Scan'),
207 defaultValue
: gettext('No Data'),
210 header
: gettext('Status'),
213 header
: gettext('Action'),
216 header
: gettext('Errors'),
225 Ext
.define('PVE.node.ZFSList', {
226 extend
: 'Ext.grid.Panel',
236 xclass
: 'Ext.app.ViewController',
238 destroyPool: function() {
240 let vm
= me
.getViewModel();
241 let view
= me
.getView();
243 const pool
= vm
.get('pool');
245 if (!view
.nodename
) {
246 throw "no node name specified";
250 throw "no pool specified";
253 Ext
.create('PVE.window.SafeDestroyStorage', {
254 url
: `/nodes/${view.nodename}/disks/zfs/${pool}`,
256 taskName
: 'zfsremove',
257 taskDone
: () => { view
.reload(); },
263 stateId
: 'grid-node-zfs',
266 text
: gettext('Name'),
271 header
: gettext('Size'),
272 renderer
: Proxmox
.Utils
.format_size
,
276 header
: gettext('Free'),
277 renderer
: Proxmox
.Utils
.format_size
,
281 header
: gettext('Allocated'),
282 renderer
: Proxmox
.Utils
.format_size
,
286 header
: gettext('Fragmentation'),
287 renderer: function(value
) {
288 return value
.toString() + '%';
293 header
: gettext('Health'),
294 renderer
: PVE
.Utils
.render_zfs_health
,
298 header
: gettext('Deduplication'),
300 renderer: function(value
) {
301 return value
.toFixed(2).toString() + 'x';
312 text
: gettext('Reload'),
313 iconCls
: 'fa fa-refresh',
314 handler: function() {
315 this.up('panel').reload();
319 text
: gettext('Create') + ': ZFS',
320 handler: function() {
321 let view
= this.up('panel');
322 Ext
.create('PVE.node.CreateZFS', {
323 nodename
: view
.nodename
,
325 destroy
: () => view
.reload(),
332 text
: gettext('Detail'),
335 handler: function() {
336 let view
= this.up('panel');
337 let selection
= view
.getSelection();
338 if (selection
.length
) {
339 view
.show_detail(selection
[0].get('name'));
358 Ext
.String
.format(gettext('No {0} selected'), 'pool'),
363 text
: gettext('More'),
364 iconCls
: 'fa fa-bars',
371 text
: gettext('Destroy'),
373 iconCls
: 'fa fa-fw fa-trash-o',
374 handler
: 'destroyPool',
384 show_detail: function(zpool
) {
387 let detailsgrid
= Ext
.create('PVE.node.ZFSStatus', {
389 nodename
: me
.nodename
,
393 let devicetree
= Ext
.create('PVE.node.ZFSDevices', {
394 title
: gettext('Devices'),
395 nodename
: me
.nodename
,
400 Ext
.create('Ext.window.Window', {
406 title
: gettext('Status') + ': ' + zpool
,
421 text
: gettext('Reload'),
422 iconCls
: 'fa fa-refresh',
423 handler: function() {
425 detailsgrid
.reload();
435 set_button_status: function() {
446 activate: function() {
449 selectionchange: function(model
, selected
) {
451 let vm
= me
.getViewModel();
453 me
.down('#detailbtn').setDisabled(selected
.length
=== 0);
454 vm
.set('pool', selected
[0]?.data
.name
|| '');
456 itemdblclick: function(grid
, record
) {
457 this.show_detail(record
.get('name'));
461 initComponent: function() {
464 me
.nodename
= me
.pveSelNode
.data
.node
;
466 throw "no node name specified";
471 fields
: ['name', 'size', 'free', 'alloc', 'dedup', 'frag', 'health'],
474 url
: `/api2/json/nodes/${me.nodename}/disks/zfs`,
482 Proxmox
.Utils
.monStoreErrors(me
, me
.getStore(), true);