From: Fabian Ebner <f.ebner@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH v10 manager 06/19] ui: HD edit: allow selecting import source
Date: Wed, 6 Apr 2022 10:04:03 +0200 [thread overview]
Message-ID: <20220406080416.66227-7-f.ebner@proxmox.com> (raw)
In-Reply-To: <20220406080416.66227-1-f.ebner@proxmox.com>
The backend now supports importing from an existing volume, or, for
root, from an arbitrary file system path.
This is also in preparation for import from OVF functionality in the
VM create wizard.
Co-developed-by: Dominic Jäger <d.jaeger@proxmox.com>
Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
---
www/manager6/qemu/HDEdit.js | 116 +++++++++++++++++++++++++++++++++++-
1 file changed, 115 insertions(+), 1 deletion(-)
diff --git a/www/manager6/qemu/HDEdit.js b/www/manager6/qemu/HDEdit.js
index 92e6d116..3edc077d 100644
--- a/www/manager6/qemu/HDEdit.js
+++ b/www/manager6/qemu/HDEdit.js
@@ -75,10 +75,19 @@ Ext.define('PVE.qemu.HDInputPanel', {
me.drive.file = me.vmconfig[values.unusedId];
confid = values.controller + values.deviceid;
} else if (me.isCreate) {
+ let diskSource = values[`diskSource-${me.id}`];
if (values.hdimage) {
me.drive.file = values.hdimage;
- } else {
+ } else if (diskSource === 'empty') {
me.drive.file = values.hdstorage + ":" + values.disksize;
+ } else if (diskSource === 'volume') {
+ me.drive.file = `${values.hdstorage}:0`;
+ me.drive['import-from'] = `${values.sourceImage}`;
+ } else if (diskSource === 'path') {
+ me.drive.file = `${values.hdstorage}:0`;
+ me.drive['import-from'] = `${values.sourcePath}`;
+ } else {
+ throw "internal error - unexcpected disk source!";
}
me.drive.format = values.diskformat;
}
@@ -168,6 +177,7 @@ Ext.define('PVE.qemu.HDInputPanel', {
var me = this;
me.down('#hdstorage').setNodename(nodename);
me.down('#hdimage').setStorage(undefined, nodename);
+ me.down('#sourceStorage').setNodename(nodename);
},
initComponent: function() {
@@ -244,6 +254,110 @@ Ext.define('PVE.qemu.HDInputPanel', {
reference: 'discard',
name: 'discard',
},
+ {
+ xtype: 'radiofield',
+ name: `diskSource-${me.id}`, // needs to be unique when used in MultiDiskPanel
+ inputValue: 'empty',
+ boxLabel: gettext('Create empty disk'),
+ hidden: !me.isCreate || me.unused,
+ checked: true,
+ listeners: {
+ change: function(field, nowSelected) {
+ if (nowSelected) {
+ me.down('pveDiskStorageSelector').setSize(); // reset
+ }
+ },
+ },
+ },
+ {
+ xtype: 'radiofield',
+ name: `diskSource-${me.id}`,
+ inputValue: 'volume',
+ boxLabel: gettext('Import from existing volume'),
+ hidden: !me.isCreate || me.unused,
+ listeners: {
+ change: (field, nowSelected) => {
+ let sourceImageSelector = me.down('#sourceImage');
+ let sourceStorageSelector = me.down('#sourceStorage');
+ if (nowSelected) {
+ me.down('pveDiskStorageSelector').setSize(
+ sourceImageSelector.getCurrentSize(),
+ true,
+ );
+ }
+
+ sourceStorageSelector.setHidden(!nowSelected);
+ sourceStorageSelector.setDisabled(!nowSelected);
+ sourceStorageSelector.fireEvent('validitychange');
+ sourceImageSelector.setHidden(!nowSelected);
+ sourceImageSelector.setDisabled(!nowSelected);
+ sourceImageSelector.fireEvent('validitychange');
+ },
+ },
+ },
+ {
+ xtype: 'pveStorageSelector',
+ itemId: 'sourceStorage',
+ name: 'sourceStorage',
+ nodename: me.nodename,
+ fieldLabel: gettext('Storage'),
+ storageContent: 'images',
+ autoSelect: me.insideWizard,
+ hidden: true,
+ disabled: true,
+ listeners: {
+ change: function(selector, selectedStorage) {
+ selector.next('pveFileSelector').setStorage(
+ selectedStorage,
+ me.getViewModel().get('nodename'),
+ );
+ },
+ },
+ },
+ {
+ xtype: 'pveFileSelector',
+ itemId: 'sourceImage',
+ name: 'sourceImage',
+ nodename: me.nodename,
+ storageContent: 'images',
+ hidden: true,
+ disabled: true,
+ fieldLabel: gettext('Image'),
+ listeners: {
+ change: function(field, value) {
+ if (!field.isDisabled()) {
+ me.down('pveDiskStorageSelector').setSize(this.getCurrentSize(), true);
+ }
+ },
+ },
+ },
+ {
+ xtype: 'radiofield',
+ name: `diskSource-${me.id}`,
+ inputValue: 'path',
+ boxLabel: gettext('Import from existing volume by path'),
+ hidden: !me.isCreate || me.unused || Proxmox.UserName !== 'root@pam',
+ listeners: {
+ change: (field, nowSelected) => {
+ let sourcePathField = me.down('#sourcePath');
+ sourcePathField.setHidden(!nowSelected);
+ sourcePathField.setDisabled(!nowSelected);
+ sourcePathField.fireEvent('validitychange');
+
+ if (nowSelected) {
+ me.down('pveDiskStorageSelector').setSize(0, true);
+ }
+ },
+ },
+ },
+ {
+ xtype: 'textfield',
+ fieldLabel: gettext('Path'),
+ itemId: 'sourcePath',
+ name: 'sourcePath',
+ hidden: true,
+ disabled: true,
+ },
);
let optionsColumn1 = [
--
2.30.2
next prev parent reply other threads:[~2022-04-06 8:04 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-04-06 8:03 [pve-devel] [PATCH-SERIES v10 manager] Add GUI to import disk & VM Fabian Ebner
2022-04-06 8:03 ` [pve-devel] [PATCH v10 manager 01/19] api: nodes: add readovf endpoint Fabian Ebner
2022-04-06 8:03 ` [pve-devel] [PATCH v10 manager 02/19] ui: HD edit: get rid of unneeded binding for backup checkbox Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 03/19] ui: HD edit: move advanced options into a dedicated tab Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 04/19] ui: disk storage selector: add setSize function Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 05/19] ui: file selector: add getCurrentSize function Fabian Ebner
2022-04-06 8:04 ` Fabian Ebner [this message]
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 07/19] ui: CD edit: handle change even if not yet rendered Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 08/19] ui: multi disk edit: only pass confid for addPanel Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 09/19] ui: HD edit: allow preselecting config ID Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 10/19] ui: multi HD edit: pre select passed-in " Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 11/19] ui: multi disk edit: allow setting config ID when adding disk Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 12/19] ui: multi disk edit: add removeAllDisks function Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 13/19] ui: multi disk edit: allow adding a disk with existing settings Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 14/19] ui: multi disk edit: expose addDisk outside of the controller Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 15/19] ui: HD edit: set drive: make specifying file/volid optional Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 16/19] ui: HD edit: support setting an import path in setDrive Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 17/19] ui: qemu: memory edit: expose setMemory outside the controller Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 18/19] ui: qemu: memory edit: allow passing explicit value Fabian Ebner
2022-04-06 8:04 ` [pve-devel] [PATCH v10 manager 19/19] ui: qemu: wizard: add import from OVF functionality Fabian Ebner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220406080416.66227-7-f.ebner@proxmox.com \
--to=f.ebner@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox