public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
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





  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
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal