From: "Dominic Jäger" <d.jaeger@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH manager v2 2/3] Hardware View: Add GUI for importdisk
Date: Thu, 30 Jul 2020 12:18:28 +0200 [thread overview]
Message-ID: <20200730101829.52823-3-d.jaeger@proxmox.com> (raw)
In-Reply-To: <20200730101829.52823-1-d.jaeger@proxmox.com>
Make importing single disks easier.
Required to import a whole VM via GUI.
Signed-off-by: Dominic Jäger <d.jaeger@proxmox.com>
---
v1->v2:
- Newlines for better blocks
- Use gettext
- Use subject instead of title
www/manager6/qemu/HDEdit.js | 83 +++++++++++++++++++++++--------
www/manager6/qemu/HardwareView.js | 18 +++++++
2 files changed, 79 insertions(+), 22 deletions(-)
diff --git a/www/manager6/qemu/HDEdit.js b/www/manager6/qemu/HDEdit.js
index e2a5b914..edebbbc1 100644
--- a/www/manager6/qemu/HDEdit.js
+++ b/www/manager6/qemu/HDEdit.js
@@ -76,23 +76,46 @@ Ext.define('PVE.qemu.HDInputPanel', {
me.drive.format = values.diskformat;
}
- PVE.Utils.propertyStringSet(me.drive, !values.backup, 'backup', '0');
- PVE.Utils.propertyStringSet(me.drive, values.noreplicate, 'replicate', 'no');
- PVE.Utils.propertyStringSet(me.drive, values.discard, 'discard', 'on');
- PVE.Utils.propertyStringSet(me.drive, values.ssd, 'ssd', 'on');
- PVE.Utils.propertyStringSet(me.drive, values.iothread, 'iothread', 'on');
- PVE.Utils.propertyStringSet(me.drive, values.cache, 'cache');
-
- var names = ['mbps_rd', 'mbps_wr', 'iops_rd', 'iops_wr'];
- Ext.Array.each(names, function(name) {
- var burst_name = name + '_max';
- PVE.Utils.propertyStringSet(me.drive, values[name], name);
- PVE.Utils.propertyStringSet(me.drive, values[burst_name], burst_name);
- });
-
-
- params[confid] = PVE.Parser.printQemuDrive(me.drive);
+ if (me.isImport) {
+ // These keys & values are accepted by the API as they are
+ let simple = ['backup', 'ssd', 'iothread', 'cache'];
+ let burst = ['mbps_rd', 'mbps_wr', 'iops_rd', 'iops_wr'];
+ burst = burst.concat(burst.map(x => `${x}_max`));
+ let available = simple.concat(burst);
+
+ let addValues = key => `${key}=${values[key]}`;
+ let selectedKeys = x => values[x];
+ let options = available.filter(selectedKeys).map(addValues).join();
+
+ // These need modification for the API
+ options += values.discard ? ',discard=on' : '';
+ options += values.noreplicate ? ',replicate=0' : '';
+
+ params.device_options = options;
+ } else {
+ PVE.Utils.propertyStringSet(me.drive, !values.backup, 'backup', '0');
+ PVE.Utils.propertyStringSet(me.drive, values.noreplicate, 'replicate', 'no');
+ PVE.Utils.propertyStringSet(me.drive, values.discard, 'discard', 'on');
+ PVE.Utils.propertyStringSet(me.drive, values.ssd, 'ssd', 'on');
+ PVE.Utils.propertyStringSet(me.drive, values.iothread, 'iothread', 'on');
+ PVE.Utils.propertyStringSet(me.drive, values.cache, 'cache');
+
+ var names = ['mbps_rd', 'mbps_wr', 'iops_rd', 'iops_wr'];
+ Ext.Array.each(names, function(name) {
+ var burst_name = name + '_max';
+ PVE.Utils.propertyStringSet(me.drive, values[name], name);
+ PVE.Utils.propertyStringSet(me.drive, values[burst_name], burst_name);
+ });
+ }
+ if (me.isImport) {
+ params.source = values.inputImage;
+ params.device = values.controller + values.deviceid;
+ params.storage = values.hdstorage;
+ if (values.diskformat) params.format = values.diskformat;
+ } else {
+ params[confid] = PVE.Parser.printQemuDrive(me.drive);
+ }
return params;
},
@@ -199,14 +222,17 @@ Ext.define('PVE.qemu.HDInputPanel', {
allowBlank: false
});
me.column1.push(me.unusedDisks);
- } else if (me.isCreate) {
- me.column1.push({
+ } else if (me.isCreate || me.isImport) {
+ let selector = {
xtype: 'pveDiskStorageSelector',
storageContent: 'images',
name: 'disk',
nodename: me.nodename,
- autoSelect: me.insideWizard
- });
+ hideSize: me.isImport,
+ autoSelect: me.insideWizard || me.isImport,
+ };
+ if (me.isImport) selector.storageLabel = gettext('Target storage');
+ me.column1.push(selector);
} else {
me.column1.push({
xtype: 'textfield',
@@ -231,6 +257,14 @@ Ext.define('PVE.qemu.HDInputPanel', {
name: 'discard'
}
);
+ if (me.isImport) {
+ me.column2.push({
+ xtype: 'textfield',
+ fieldLabel: gettext('Source image'),
+ name: 'inputImage',
+ emptyText: '/home/user/disk.qcow2',
+ });
+ }
me.advancedColumn1.push(
{
@@ -372,14 +406,19 @@ Ext.define('PVE.qemu.HDEdit', {
confid: me.confid,
nodename: nodename,
unused: unused,
- isCreate: me.isCreate
+ isCreate: me.isCreate,
+ isImport: me.isImport,
});
var subject;
if (unused) {
me.subject = gettext('Unused Disk');
+ } else if (me.isImport) {
+ me.subject = gettext('Import Disk');
+ me.submitText = 'Import';
+ me.backgroundDelay = undefined;
} else if (me.isCreate) {
- me.subject = gettext('Hard Disk');
+ me.subject = gettext('Hard Disk');
} else {
me.subject = gettext('Hard Disk') + ' (' + me.confid + ')';
}
diff --git a/www/manager6/qemu/HardwareView.js b/www/manager6/qemu/HardwareView.js
index 40b3fe86..f9735998 100644
--- a/www/manager6/qemu/HardwareView.js
+++ b/www/manager6/qemu/HardwareView.js
@@ -436,6 +436,23 @@ Ext.define('PVE.qemu.HardwareView', {
handler: run_move
});
+ var import_btn = new Proxmox.button.Button({
+ text: gettext('Import disk'),
+ hidden: !(caps.vms['VM.Allocate'] &&
+ caps.storage['Datastore.AllocateTemplate'] &&
+ caps.storage['Datastore.AllocateSpace']),
+ handler: function() {
+ var win = Ext.create('PVE.qemu.HDEdit', {
+ method: 'POST',
+ url: `/api2/extjs/${baseurl}`,
+ pveSelNode: me.pveSelNode,
+ isImport: true,
+ });
+ win.on('destroy', me.reload, me);
+ win.show();
+ },
+ });
+
var remove_btn = new Proxmox.button.Button({
text: gettext('Remove'),
defaultText: gettext('Remove'),
@@ -752,6 +769,7 @@ Ext.define('PVE.qemu.HardwareView', {
edit_btn,
resize_btn,
move_btn,
+ import_btn,
revert_btn
],
rows: rows,
--
2.20.1
next prev parent reply other threads:[~2020-07-30 10:19 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-07-30 10:18 [pve-devel] [PATCH widget-toolkit v2 0/3] " Dominic Jäger
2020-07-30 10:18 ` [pve-devel] [PATCH widget-toolkit v2 1/3] EditWindow: Change url to 'importdisk' for import Dominic Jäger
2020-08-20 15:36 ` Thomas Lamprecht
2020-08-24 8:42 ` Dominic Jäger
2020-08-25 9:31 ` Dominic Jäger
2020-07-30 10:18 ` Dominic Jäger [this message]
2020-07-30 10:18 ` [pve-devel] [PATCH qemu-server v2 3/3] Move importdisk from qm to API Dominic Jäger
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=20200730101829.52823-3-d.jaeger@proxmox.com \
--to=d.jaeger@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