Adds a new button to the hardware panel labeled 'Reassign disk' and enables a user to reassign a disk to another VM.
Signed-off-by: Aaron Lauterer <a.laute...@proxmox.com> --- v3 -> v4: * added check to not show template VMs in dropdown * renamed disk parameter to `drive_name` v2 -> v3: * fixed check to omit the current vmid in the target dropdown * renamed parameter disk to drive_key * added missing comma v1 -> v2: fixed linter errors This patch needs the previous patch series [0] applied which adds the backend for disk reassignments. [0] https://lists.proxmox.com/pipermail/pve-devel/2020-December/046479.html www/manager6/Makefile | 1 + www/manager6/qemu/HDReassign.js | 80 +++++++++++++++++++++++++++++++ www/manager6/qemu/HardwareView.js | 30 ++++++++++++ 3 files changed, 111 insertions(+) create mode 100644 www/manager6/qemu/HDReassign.js diff --git a/www/manager6/Makefile b/www/manager6/Makefile index 85f90ecd..21debfcb 100644 --- a/www/manager6/Makefile +++ b/www/manager6/Makefile @@ -200,6 +200,7 @@ JSSRC= \ qemu/HDEdit.js \ qemu/HDEfi.js \ qemu/HDMove.js \ + qemu/HDReassign.js \ qemu/HDResize.js \ qemu/HardwareView.js \ qemu/IPConfigEdit.js \ diff --git a/www/manager6/qemu/HDReassign.js b/www/manager6/qemu/HDReassign.js new file mode 100644 index 00000000..d0aa97f8 --- /dev/null +++ b/www/manager6/qemu/HDReassign.js @@ -0,0 +1,80 @@ +Ext.define('PVE.window.HDReassign', { + extend: 'Proxmox.window.Edit', + + resizeable: false, + title: gettext('Reassign disk'), + submitText: gettext('Reassign disk'), + showReset: false, + method: 'POST', + showProgress: true, + width: 350, + + viewModel: { + data: { + targetVMData: {}, + show_running_hint: false, + }, + }, + + items: [ + { + xtype: 'combobox', + name: 'target_vmid', + reference: 'target_vmid', + fieldLabel: gettext('Target VMID'), + bind: { + store: '{targetVMData}', + }, + queryMode: 'local', + displayField: 'name', + valueField: 'vmid', + anyMatch: true, + emptyText: gettext('Select VM'), + }, + { + xtype: 'displayfield', + padding: '5 0 0 0', + userCls: 'pmx-hint', + value: gettext('This disk cannot be reassigned while the VM is running'), + bind: { + hidden: '{!show_running_hint}', + }, + }, + ], + + controller: { + xclass: 'Ext.app.ViewController', + init: function(view) { + let me = view; + let vm = me.getViewModel(); + let vms = PVE.Utils.getNodeVMs(me.nodename); + + let show_running_hint = vms[me.vmid].running && !me.drive_name.startsWith('unused'); + vm.set('show_running_hint', show_running_hint); + + if (show_running_hint) { + me.lookup('target_vmid').setDisabled(true); + } + + let dropdownData = []; + for (const [vmid, data] of Object.entries(vms)) { + if (parseInt(vmid, 10) === parseInt(me.vmid, 10)) { continue; } + if (data.template) { continue; } + dropdownData.push({ + vmid: vmid, + name: `${vmid} ${data.name}`, + }); + } + + vm.set('targetVMData', { data: dropdownData }); + }, + }, + + getValues: function() { + let me = this; + let values = me.callParent(arguments); + values.drive_name = me.drive_name; + + return values; + }, +}); diff --git a/www/manager6/qemu/HardwareView.js b/www/manager6/qemu/HardwareView.js index b641317d..7b357856 100644 --- a/www/manager6/qemu/HardwareView.js +++ b/www/manager6/qemu/HardwareView.js @@ -415,6 +415,25 @@ Ext.define('PVE.qemu.HardwareView', { win.on('destroy', me.reload, me); }; + var run_reassign = function() { + let rec = sm.getSelection()[0]; + if (!rec) { + return; + } + + let win = Ext.create('PVE.window.HDReassign', { + drive_name: rec.data.key, + vmid: vmid, + nodename: nodename, + title: gettext('Reassign disk') + ': ' + rec.data.key, + url: '/api2/extjs/nodes/' + nodename + '/qemu/' + vmid + '/reassign_disk', + }); + + win.show(); + + win.on('destroy', me.reload, me); + }; + var edit_btn = new Proxmox.button.Button({ text: gettext('Edit'), selModel: sm, @@ -436,6 +455,13 @@ Ext.define('PVE.qemu.HardwareView', { handler: run_move }); + var reassign_btn = new Proxmox.button.Button({ + text: gettext('Reassign disk'), + selModel: sm, + disabled: true, + handler: run_reassign, + }); + var remove_btn = new Proxmox.button.Button({ text: gettext('Remove'), defaultText: gettext('Remove'), @@ -577,6 +603,7 @@ Ext.define('PVE.qemu.HardwareView', { edit_btn.disable(); resize_btn.disable(); move_btn.disable(); + reassign_btn.disable(); revert_btn.disable(); return; } @@ -603,6 +630,8 @@ Ext.define('PVE.qemu.HardwareView', { move_btn.setDisabled(pending || !(isUsedDisk || isEfi) || !diskCap); + reassign_btn.setDisabled(pending || !(isUsedDisk || isEfi || isUnusedDisk) || !diskCap); + revert_btn.setDisabled(!pending); }; @@ -752,6 +781,7 @@ Ext.define('PVE.qemu.HardwareView', { edit_btn, resize_btn, move_btn, + reassign_btn, revert_btn ], rows: rows, -- 2.20.1 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel