From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 5C8061FF187 for ; Mon, 14 Jul 2025 14:28:15 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 6C0A816C22; Mon, 14 Jul 2025 14:29:09 +0200 (CEST) From: Dominik Csapak To: pve-devel@lists.proxmox.com Date: Mon, 14 Jul 2025 14:28:33 +0200 Message-Id: <20250714122835.3347682-2-d.csapak@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250714122835.3347682-1-d.csapak@proxmox.com> References: <20250714122835.3347682-1-d.csapak@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.022 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH manager v8 1/3] ui: qemu hd edit: allow importing a disk from the import storage 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: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" from the hardware view of a virtual machine, by adding a new 'Import Hard Disk' option in the 'Add' menu. It replaces the standard storage selector by a import storage selector, the file selector for the image to be imported, and a target storage selector. partially fixes #2424 Signed-off-by: Dominik Csapak --- www/manager6/qemu/HDEdit.js | 67 +++++++++++++++++++++++++++---- www/manager6/qemu/HardwareView.js | 6 +++ 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/www/manager6/qemu/HDEdit.js b/www/manager6/qemu/HDEdit.js index c3a5d0af..8cc99183 100644 --- a/www/manager6/qemu/HDEdit.js +++ b/www/manager6/qemu/HDEdit.js @@ -8,6 +8,8 @@ Ext.define('PVE.qemu.HDInputPanel', { unused: false, // ADD usused disk imaged + importDisk: false, // use import options + vmconfig: {}, // used to select usused disks viewModel: { @@ -78,7 +80,9 @@ Ext.define('PVE.qemu.HDInputPanel', { if (values.hdimage) { me.drive.file = values.hdimage; } else { - me.drive.file = values.hdstorage + ':' + values.disksize; + let disksize = values['import-from'] ? 0 : values.disksize; + me.drive.file = `${values.hdstorage}:${disksize}`; + PVE.Utils.propertyStringSet(me.drive, values['import-from'], 'import-from'); } me.drive.format = values.diskformat; } @@ -168,6 +172,11 @@ Ext.define('PVE.qemu.HDInputPanel', { var me = this; me.down('#hdstorage').setNodename(nodename); me.down('#hdimage').setStorage(undefined, nodename); + + me.lookup('new-disk')?.setNodename(nodename); + me.lookup('import-source')?.setNodename(nodename); + me.lookup('import-source-file')?.setNodename(nodename); + me.lookup('import-target')?.setNodename(nodename); }, hasAdvanced: true, @@ -222,13 +231,52 @@ Ext.define('PVE.qemu.HDInputPanel', { }); column1.push(me.unusedDisks); } else if (me.isCreate) { - column1.push({ - xtype: 'pveDiskStorageSelector', - storageContent: 'images', - name: 'disk', - nodename: me.nodename, - autoSelect: me.insideWizard, - }); + if (!me.importDisk) { + column1.push({ + reference: 'new-disk', + xtype: 'pveDiskStorageSelector', + storageContent: 'images', + name: 'disk', + nodename: me.nodename, + autoSelect: me.insideWizard, + }); + } else { + column1.push({ + xtype: 'pveStorageSelector', + reference: 'import-source', + fieldLabel: gettext('Import Storage'), + name: 'import-source-storage', + storageContent: 'import', + nodename: me.nodename, + autoSelect: me.insideWizard, + disabled: false, + listeners: { + change: function (_selector, storage) { + me.lookup('import-source-file').setStorage(storage); + me.lookup('import-source-file').setDisabled(!storage); + }, + }, + }); + column1.push({ + xtype: 'pveFileSelector', + reference: 'import-source-file', + fieldLabel: gettext('Select Image'), + storageContent: 'import', + name: 'import-from', + filter: (rec) => ['qcow2', 'vmdk', 'raw'].indexOf(rec?.data?.format) !== -1, + nodename: me.nodename, + }); + column1.push({ + xtype: 'pveDiskStorageSelector', + reference: 'import-target', + storageLabel: gettext('Target Storage'), + hideSize: true, + storageContent: 'images', + name: 'disk', + nodename: me.nodename, + autoSelect: me.insideWizard, + }); + } } else { column1.push({ xtype: 'textfield', @@ -455,6 +503,8 @@ Ext.define('PVE.qemu.HDEdit', { width: 600, bodyPadding: 0, + importDisk: false, + initComponent: function () { var me = this; @@ -472,6 +522,7 @@ Ext.define('PVE.qemu.HDEdit', { nodename: nodename, unused: unused, isCreate: me.isCreate, + importDisk: me.importDisk, }); if (unused) { diff --git a/www/manager6/qemu/HardwareView.js b/www/manager6/qemu/HardwareView.js index ece3de3d..f1f715eb 100644 --- a/www/manager6/qemu/HardwareView.js +++ b/www/manager6/qemu/HardwareView.js @@ -727,6 +727,12 @@ Ext.define('PVE.qemu.HardwareView', { disabled: !caps.vms['VM.Config.Disk'], handler: editorFactory('HDEdit'), }, + { + text: gettext('Import Hard Disk'), + iconCls: 'fa fa-fw fa-cloud-download', + disabled: !caps.vms['VM.Config.Disk'], + handler: editorFactory('HDEdit', { importDisk: true }), + }, { text: gettext('CD/DVD Drive'), iconCls: 'pve-itype-icon-cdrom', -- 2.39.5 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel