From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 30C9E74396 for ; Sun, 18 Apr 2021 17:57:55 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 265EBCB47 for ; Sun, 18 Apr 2021 17:57:55 +0200 (CEST) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [212.186.127.180]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 563FACB3A for ; Sun, 18 Apr 2021 17:57:51 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 1C8AE42DD3 for ; Sun, 18 Apr 2021 17:57:51 +0200 (CEST) Message-ID: <23360ed5-3c39-280a-9228-f22f8e5d2fbb@proxmox.com> Date: Sun, 18 Apr 2021 17:57:49 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:88.0) Gecko/20100101 Thunderbird/88.0 Content-Language: en-US To: Proxmox VE development discussion , Aaron Lauterer References: <20210215152647.7328-1-a.lauterer@proxmox.com> <20210215152647.7328-4-a.lauterer@proxmox.com> From: Thomas Lamprecht In-Reply-To: <20210215152647.7328-4-a.lauterer@proxmox.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-SPAM-LEVEL: Spam detection results: 0 AWL -0.040 Adjusted score from AWL reputation of From: address KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment NICE_REPLY_A -0.001 Looks like a legit reply (A) RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: Re: [pve-devel] [PATCH v5 manager 3/3] ui: qemu: Add disk reassign dialog X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 18 Apr 2021 15:57:55 -0000 On 15.02.21 16:26, Aaron Lauterer wrote: > 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 > --- > > v4 -> v5: rebased > > 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 77640e53..d129deda 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', please use template strings for such things `/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'), > @@ -578,6 +604,7 @@ Ext.define('PVE.qemu.HardwareView', { > edit_btn.disable(); > resize_btn.disable(); > move_btn.disable(); > + reassign_btn.disable(); please not yet another button in this already crowed GUI space... This could actually live under move-disk, making it a split button or re-using it completely. After all it's just a move-disk, just not to another storage but to another VM. > revert_btn.disable(); > return; > } > @@ -604,6 +631,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, >