extend: 'Ext.tree.Panel',
alias: 'widget.pmxDiskList',
+ supportsWipeDisk: false,
+
rootVisible: false,
emptyText: gettext('No Disks found'),
waitMsgTarget: view,
method: 'POST',
params: { disk: rec.data.name },
- failure: function(response, options) {
- Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+ failure: response => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
+ success: function(response, options) {
+ Ext.create('Proxmox.window.TaskProgress', {
+ upid: response.result.data,
+ taskDone: function() {
+ me.reload();
+ },
+ autoShow: true,
+ });
},
+ });
+ },
+
+ wipeDisk: function() {
+ let me = this;
+ let view = me.getView();
+ let selection = view.getSelection();
+ if (!selection || selection.length < 1) return;
+
+ let rec = selection[0];
+ Proxmox.Utils.API2Request({
+ url: `${view.exturl}/wipedisk`,
+ waitMsgTarget: view,
+ method: 'PUT',
+ params: { disk: rec.data.name },
+ failure: response => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
success: function(response, options) {
- var upid = response.result.data;
- var win = Ext.create('Proxmox.window.TaskProgress', {
- upid: upid,
+ Ext.create('Proxmox.window.TaskProgress', {
+ upid: response.result.data,
taskDone: function() {
me.reload();
},
+ autoShow: true,
});
- win.show();
},
});
},
},
},
- tbar: [
- {
- text: gettext('Reload'),
- handler: 'reload',
- },
- {
- xtype: 'proxmoxButton',
- text: gettext('Show S.M.A.R.T. values'),
- parentXType: 'treepanel',
- disabled: true,
- enableFn: function(rec) {
- if (!rec || rec.data.parent) {
- return false;
- } else {
- return true;
- }
- },
- handler: 'openSmartWindow',
- },
- {
- xtype: 'proxmoxButton',
- text: gettext('Initialize Disk with GPT'),
- parentXType: 'treepanel',
- disabled: true,
- enableFn: function(rec) {
- if (!rec || rec.data.parent ||
- (rec.data.used && rec.data.used !== 'unused')) {
- return false;
- } else {
- return true;
- }
- },
- handler: 'initGPT',
- },
- ],
+ renderDiskType: function(v) {
+ if (v === undefined) return Proxmox.Utils.unknownText;
+ switch (v) {
+ case 'ssd': return 'SSD';
+ case 'hdd': return 'Hard Disk';
+ case 'usb': return 'USB';
+ default: return v;
+ }
+ },
+
+ renderDiskUsage: function(v, metaData, rec) {
+ let extendedInfo = '';
+ if (rec) {
+ let types = [];
+ if (rec.data.osdid !== undefined && rec.data.osdid >= 0) {
+ types.push(`OSD.${rec.data.osdid.toString()}`);
+ }
+ if (rec.data.journals > 0) {
+ types.push('Journal');
+ }
+ if (rec.data.db > 0) {
+ types.push('DB');
+ }
+ if (rec.data.wal > 0) {
+ types.push('WAL');
+ }
+ if (types.length > 0) {
+ extendedInfo = `, Ceph (${types.join(', ')})`;
+ }
+ }
+ return v ? `${v}${extendedInfo}` : Proxmox.Utils.noText;
+ },
columns: [
{
sortable: true,
dataIndex: 'disk-type',
renderer: function(v) {
- if (v === undefined) return Proxmox.Utils.unknownText;
- switch (v) {
- case 'ssd': return 'SSD';
- case 'hdd': return 'Hard Disk';
- case 'usb': return 'USB';
- default: return v;
- }
+ let me = this;
+ return me.renderDiskType(v);
},
},
{
width: 150,
sortable: false,
renderer: function(v, metaData, rec) {
- let extendedInfo = ' ';
- if (rec) {
- let types = [];
- if (rec.data.osdid !== undefined && rec.data.osdid >= 0) {
- types.push(`OSD.${rec.data.osdid.toString()}`);
- }
- if (rec.data.journals > 0) {
- types.push('Journal');
- }
- if (rec.data.db > 0) {
- types.push('DB');
- }
- if (rec.data.wal > 0) {
- types.push('WAL');
- }
- if (types.length > 0) {
- extendedInfo = `, Ceph (${types.join(', ')})`;
- }
- }
- return v ? `${v}${extendedInfo}` : Proxmox.Utils.noText;
+ let me = this;
+ return me.renderDiskUsage(v, metaData, rec);
},
dataIndex: 'used',
},
listeners: {
itemdblclick: 'openSmartWindow',
},
+
+ initComponent: function() {
+ let me = this;
+
+ let tbar = [
+ {
+ text: gettext('Reload'),
+ handler: 'reload',
+ },
+ {
+ xtype: 'proxmoxButton',
+ text: gettext('Show S.M.A.R.T. values'),
+ parentXType: 'treepanel',
+ disabled: true,
+ enableFn: function(rec) {
+ if (!rec || rec.data.parent) {
+ return false;
+ } else {
+ return true;
+ }
+ },
+ handler: 'openSmartWindow',
+ },
+ {
+ xtype: 'proxmoxButton',
+ text: gettext('Initialize Disk with GPT'),
+ parentXType: 'treepanel',
+ disabled: true,
+ enableFn: function(rec) {
+ if (!rec || rec.data.parent ||
+ (rec.data.used && rec.data.used !== 'unused')) {
+ return false;
+ } else {
+ return true;
+ }
+ },
+ handler: 'initGPT',
+ },
+ ];
+
+ if (me.supportsWipeDisk) {
+ tbar.push('-');
+ tbar.push({
+ xtype: 'proxmoxButton',
+ text: gettext('Wipe Disk'),
+ parentXType: 'treepanel',
+ dangerous: true,
+ confirmMsg: function(rec) {
+ const data = rec.data;
+
+ let mainMessage = Ext.String.format(
+ gettext('Are you sure you want to wipe {0}?'),
+ data.devpath,
+ );
+ mainMessage += `<br> ${gettext('All data on the device will be lost!')}`;
+
+ const type = me.renderDiskType(data["disk-type"]);
+
+ let usage;
+ if (data.children.length > 0) {
+ const partitionUsage = data.children.map(
+ partition => me.renderDiskUsage(partition.used),
+ ).join(', ');
+ usage = `${gettext('Partitions')} (${partitionUsage})`;
+ } else {
+ usage = me.renderDiskUsage(data.used, undefined, rec);
+ }
+
+ const size = Proxmox.Utils.format_size(data.size);
+ const serial = Ext.String.htmlEncode(data.serial);
+
+ let additionalInfo = `${gettext('Type')}: ${type}<br>`;
+ additionalInfo += `${gettext('Usage')}: ${usage}<br>`;
+ additionalInfo += `${gettext('Size')}: ${size}<br>`;
+ additionalInfo += `${gettext('Serial')}: ${serial}`;
+
+ return `${mainMessage}<br><br>${additionalInfo}`;
+ },
+ disabled: true,
+ enableFn: function(rec) {
+ // TODO enable for partitions once they can be selected for ZFS,LVM,etc. creation
+ if (!rec || rec.data.parent) {
+ return false;
+ } else {
+ return true;
+ }
+ },
+ handler: 'wipeDisk',
+ });
+ }
+
+ me.tbar = tbar;
+
+ me.callParent();
+ },
});