* [pve-devel] [PATCH widget-toolkit v2 0/3] Add GUI for importdisk
@ 2020-07-30 10:18 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
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Dominic Jäger @ 2020-07-30 10:18 UTC (permalink / raw)
To: pve-devel
This series makes importing disks possible via GUI which is one step to make
migrating from other hypervisors easier.
Dominic Jäger (1):
EditWindow: Change url to 'importdisk' for import
Dominic Jäger (1):
Hardware View: Add GUI for importdisk
Dominic Jäger (1):
Move importdisk from qm to API
--
2.20.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [pve-devel] [PATCH widget-toolkit v2 1/3] EditWindow: Change url to 'importdisk' for import
2020-07-30 10:18 [pve-devel] [PATCH widget-toolkit v2 0/3] Add GUI for importdisk Dominic Jäger
@ 2020-07-30 10:18 ` Dominic Jäger
2020-08-20 15:36 ` Thomas Lamprecht
2020-07-30 10:18 ` [pve-devel] [PATCH manager v2 2/3] Hardware View: Add GUI for importdisk Dominic Jäger
2020-07-30 10:18 ` [pve-devel] [PATCH qemu-server v2 3/3] Move importdisk from qm to API Dominic Jäger
2 siblings, 1 reply; 7+ messages in thread
From: Dominic Jäger @ 2020-07-30 10:18 UTC (permalink / raw)
To: pve-devel
Signed-off-by: Dominic Jäger <d.jaeger@proxmox.com>
---
v1->v2: unchanged
src/window/Edit.js | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/window/Edit.js b/src/window/Edit.js
index d7972b6..2dfab19 100644
--- a/src/window/Edit.js
+++ b/src/window/Edit.js
@@ -134,6 +134,10 @@ Ext.define('Proxmox.window.Edit', {
values = undefined;
}
+ if (me.isImport) {
+ url = url.replace('config', 'importdisk');
+ }
+
Proxmox.Utils.API2Request({
url: url,
waitMsgTarget: me,
--
2.20.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [pve-devel] [PATCH manager v2 2/3] Hardware View: Add GUI for importdisk
2020-07-30 10:18 [pve-devel] [PATCH widget-toolkit v2 0/3] Add GUI for importdisk 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-07-30 10:18 ` Dominic Jäger
2020-07-30 10:18 ` [pve-devel] [PATCH qemu-server v2 3/3] Move importdisk from qm to API Dominic Jäger
2 siblings, 0 replies; 7+ messages in thread
From: Dominic Jäger @ 2020-07-30 10:18 UTC (permalink / raw)
To: pve-devel
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
^ permalink raw reply [flat|nested] 7+ messages in thread
* [pve-devel] [PATCH qemu-server v2 3/3] Move importdisk from qm to API
2020-07-30 10:18 [pve-devel] [PATCH widget-toolkit v2 0/3] Add GUI for importdisk 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-07-30 10:18 ` [pve-devel] [PATCH manager v2 2/3] Hardware View: Add GUI for importdisk Dominic Jäger
@ 2020-07-30 10:18 ` Dominic Jäger
2 siblings, 0 replies; 7+ messages in thread
From: Dominic Jäger @ 2020-07-30 10:18 UTC (permalink / raw)
To: pve-devel
Additionally, add parameters that enable directly (avoiding the intermediate
step as unused disk) attaching the disk to a bus/device with all known disk
options.
Required to create a GUI for importdisk.
Signed-off-by: Dominic Jäger <d.jaeger@proxmox.com>
---
v1->v2:
- dot for multi-line string at end of line
- API descriptions
- typo for drivedesc
PVE/API2/Qemu.pm | 113 ++++++++++++++++++++++++++++++++++-
PVE/CLI/qm.pm | 57 +-----------------
PVE/QemuServer/Drive.pm | 14 +++++
PVE/QemuServer/ImportDisk.pm | 2 +-
4 files changed, 127 insertions(+), 59 deletions(-)
diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 8da616a..66e630d 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -24,6 +24,7 @@ use PVE::QemuServer;
use PVE::QemuServer::Drive;
use PVE::QemuServer::CPUConfig;
use PVE::QemuServer::Monitor qw(mon_cmd);
+use PVE::QemuServer::ImportDisk qw(do_import);
use PVE::QemuMigrate;
use PVE::RPCEnvironment;
use PVE::AccessControl;
@@ -45,8 +46,6 @@ BEGIN {
}
}
-use Data::Dumper; # fixme: remove
-
use base qw(PVE::RESTHandler);
my $opt_force_description = "Force physical removal. Without this, we simple remove the disk from the config file and create an additional configuration entry called 'unused[n]', which contains the volume ID. Unlink of unused[n] always cause physical removal.";
@@ -4265,4 +4264,114 @@ __PACKAGE__->register_method({
return PVE::QemuServer::Cloudinit::dump_cloudinit_config($conf, $param->{vmid}, $param->{type});
}});
+__PACKAGE__->register_method ({
+ name => 'importdisk',
+ path => '{vmid}/importdisk',
+ method => 'POST',
+ protected => 1, # for worker upid file
+ proxyto => 'node',
+ description => "Import an external disk image into a VM. The image format ".
+ "has to be supported by qemu-img.",
+ permissions => {
+ check => [ 'and',
+ [ 'perm', '/storage/{storage}', ['Datastore.AllocateTemplate']],
+ [ 'perm', '/storage/{storage}', ['Datastore.AllocateSpace']],
+ [ 'perm', '/vms/{vmid}', ['VM.Allocate']],
+ ],
+ },
+ parameters => {
+ additionalProperties => 0,
+ properties => {
+ node => get_standard_option('pve-node'),
+ vmid => get_standard_option('pve-vmid',
+ {completion => \&PVE::QemuServer::complete_vmid}),
+ source => {
+ description => "Path to the disk image to import",
+ type => 'string',
+ },
+ device => {
+ type => 'string',
+ description => "Bus/Device type of the new disk ".
+ "(e.g. 'ide0', 'scsi2'). Will add the image as unused disk ".
+ "if omitted.",
+ enum => [PVE::QemuServer::Drive::valid_drive_names()],
+ optional => 1,
+ },
+ device_options => {
+ type => 'string',
+ format => 'drive_options',
+ description => "Options to set for the new disk ".
+ "(e.g. 'discard=on,backup=0')",
+ optional => 1,
+ },
+ storage => get_standard_option('pve-storage-id', {
+ description => "The storage to which the image will be imported to.",
+ completion => \&PVE::QemuServer::complete_storage,
+ }),
+ format => {
+ type => 'string',
+ description => 'Target format.',
+ enum => [ 'raw', 'qcow2', 'vmdk' ],
+ optional => 1,
+ },
+ digest => get_standard_option('pve-config-digest'),
+ },
+ },
+ returns => { type => 'string'},
+ code => sub {
+ my ($params) = @_;
+ my $rpcenv = PVE::RPCEnvironment::get();
+ my $authuser = $rpcenv->get_user();
+
+ my $vmid = extract_param($params, 'vmid');
+ my $source = extract_param($params, 'source');
+ my $digest = extract_param($params, 'digest');
+ my $device_options = extract_param($params, 'device_options');
+ my $device = extract_param($params, 'device');
+ my $storage = extract_param($params, 'storage');
+ my $vm_conf = PVE::QemuConfig->load_config($vmid);
+
+ die "Could not import because source parameter is an empty string\n"
+ if ($source eq "");
+ die "Could not import because source '$source' is not an absolute path\n"
+ if $source !~ m!/!;
+ die "Could not import because source '$source' does not exist"
+ if !-e $source;
+ die "VM $vmid config checksum missmatch (file change by other user?)\n"
+ if $digest && $digest ne $vm_conf->{digest};
+ die "Could not import because device $device is already in use in ".
+ "VM $vmid. Choose a different device!\n"
+ if $device && $vm_conf->{$device};
+
+ my $worker = sub {
+ my $message = $device ? "to $device on" : 'as unused disk to';
+ print "Importing disk '$source' $message VM $vmid ...\n";
+ my ($unused_disk, $volid) = eval {
+ PVE::QemuServer::ImportDisk::do_import(
+ $source, $vmid, $storage,
+ {format => extract_param($params, 'format')},
+ )
+ };
+ die "Importing disk failed: $@\n" if $@;
+
+ if ($device) {
+ eval {
+ $update_vm_api->({
+ vmid => $vmid,
+ $device => "$volid,$device_options",
+ }, 1);
+ };
+ # Importing large disks takes a lot of time
+ # => don't remove disk automatically on option update error
+ die "Copying disk to $unused_disk succeeded but attaching it ".
+ "as $device and setting its options to $device_options ".
+ "failed: $@.\n Adjust them manually.\n" if $@;
+ }
+ print "Successfully imported disk '$source' as ".
+ ($device ? $device : $unused_disk) . ": $volid'\n";
+ };
+ my $upid = $rpcenv->fork_worker('importdisk', $vmid, $authuser, $worker);
+ return $upid;
+ }});
+
1;
diff --git a/PVE/CLI/qm.pm b/PVE/CLI/qm.pm
index 282fa86..4a304ce 100755
--- a/PVE/CLI/qm.pm
+++ b/PVE/CLI/qm.pm
@@ -445,61 +445,6 @@ __PACKAGE__->register_method ({
return undef;
}});
-__PACKAGE__->register_method ({
- name => 'importdisk',
- path => 'importdisk',
- method => 'POST',
- description => "Import an external disk image as an unused disk in a VM. The
- image format has to be supported by qemu-img(1).",
- parameters => {
- additionalProperties => 0,
- properties => {
- vmid => get_standard_option('pve-vmid', {completion => \&PVE::QemuServer::complete_vmid}),
- source => {
- description => 'Path to the disk image to import',
- type => 'string',
- optional => 0,
- },
- storage => get_standard_option('pve-storage-id', {
- description => 'Target storage ID',
- completion => \&PVE::QemuServer::complete_storage,
- optional => 0,
- }),
- format => {
- type => 'string',
- description => 'Target format',
- enum => [ 'raw', 'qcow2', 'vmdk' ],
- optional => 1,
- },
- },
- },
- returns => { type => 'null'},
- code => sub {
- my ($param) = @_;
-
- my $vmid = extract_param($param, 'vmid');
- my $source = extract_param($param, 'source');
- my $storeid = extract_param($param, 'storage');
- my $format = extract_param($param, 'format');
-
- my $vm_conf = PVE::QemuConfig->load_config($vmid);
- PVE::QemuConfig->check_lock($vm_conf);
- die "$source: non-existent or non-regular file\n" if (! -f $source);
-
- my $storecfg = PVE::Storage::config();
- PVE::Storage::storage_check_enabled($storecfg, $storeid);
-
- my $target_storage_config = PVE::Storage::storage_config($storecfg, $storeid);
- die "storage $storeid does not support vm images\n"
- if !$target_storage_config->{content}->{images};
-
- print "importing disk '$source' to VM $vmid ...\n";
- my ($drive_id, $volid) = PVE::QemuServer::ImportDisk::do_import($source, $vmid, $storeid, { format => $format });
- print "Successfully imported disk as '$drive_id:$volid'\n";
-
- return undef;
- }});
-
__PACKAGE__->register_method ({
name => 'terminal',
path => 'terminal',
@@ -984,7 +929,7 @@ our $cmddef = {
terminal => [ __PACKAGE__, 'terminal', ['vmid']],
- importdisk => [ __PACKAGE__, 'importdisk', ['vmid', 'source', 'storage']],
+ importdisk => [ "PVE::API2::Qemu", 'importdisk', ['vmid', 'source', 'storage'], { node => $nodename }],
importovf => [ __PACKAGE__, 'importovf', ['vmid', 'manifest', 'storage']],
diff --git a/PVE/QemuServer/Drive.pm b/PVE/QemuServer/Drive.pm
index 91c33f8..e7cb74c 100644
--- a/PVE/QemuServer/Drive.pm
+++ b/PVE/QemuServer/Drive.pm
@@ -201,6 +201,7 @@ my %wwn_fmt = (
},
);
+
my $add_throttle_desc = sub {
my ($key, $type, $what, $unit, $longunit, $minimum) = @_;
my $d = {
@@ -308,6 +309,19 @@ my $alldrive_fmt = {
%wwn_fmt,
};
+my %optional_file_drivedesc_base = %drivedesc_base;
+$optional_file_drivedesc_base{file}{optional} = 1;
+my $drive_options_fmt = {
+ %optional_file_drivedesc_base,
+ %iothread_fmt,
+ %model_fmt,
+ %queues_fmt,
+ %scsiblock_fmt,
+ %ssd_fmt,
+ %wwn_fmt,
+};
+PVE::JSONSchema::register_format('drive_options', $drive_options_fmt);
+
my $efidisk_fmt = {
volume => { alias => 'file' },
file => {
diff --git a/PVE/QemuServer/ImportDisk.pm b/PVE/QemuServer/ImportDisk.pm
index 51ad52e..d89cd4d 100755
--- a/PVE/QemuServer/ImportDisk.pm
+++ b/PVE/QemuServer/ImportDisk.pm
@@ -38,7 +38,7 @@ sub do_import {
}
if ($drive_name) {
- # should never happen as setting $drive_name is not exposed to public interface
+ # Exposed in importdisk API only
die "cowardly refusing to overwrite existing entry: $drive_name\n" if $vm_conf->{$drive_name};
my $modified = {}; # record what $option we modify
--
2.20.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [pve-devel] [PATCH widget-toolkit v2 1/3] EditWindow: Change url to 'importdisk' for import
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
0 siblings, 1 reply; 7+ messages in thread
From: Thomas Lamprecht @ 2020-08-20 15:36 UTC (permalink / raw)
To: Proxmox VE development discussion, Dominic Jäger
On 30.07.20 12:18, Dominic Jäger wrote:
> Signed-off-by: Dominic Jäger <d.jaeger@proxmox.com>
> ---
> v1->v2: unchanged
>
> src/window/Edit.js | 4 ++++
> 1 file changed, 4 insertions(+)
>
> diff --git a/src/window/Edit.js b/src/window/Edit.js
> index d7972b6..2dfab19 100644
> --- a/src/window/Edit.js
> +++ b/src/window/Edit.js
> @@ -134,6 +134,10 @@ Ext.define('Proxmox.window.Edit', {
> values = undefined;
> }
>
> + if (me.isImport) {
> + url = url.replace('config', 'importdisk');
> + }
> +
I'd rather avoid doing this here, i.e., the common shared code should not
do such transforming things specific for a single use case downstream..
That adds coupling, which should be avoided if possible.
Why can the import window instance not handle this?
sorry to catch this only now..
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [pve-devel] [PATCH widget-toolkit v2 1/3] EditWindow: Change url to 'importdisk' for import
2020-08-20 15:36 ` Thomas Lamprecht
@ 2020-08-24 8:42 ` Dominic Jäger
2020-08-25 9:31 ` Dominic Jäger
0 siblings, 1 reply; 7+ messages in thread
From: Dominic Jäger @ 2020-08-24 8:42 UTC (permalink / raw)
To: Thomas Lamprecht; +Cc: Proxmox VE development discussion
On Thu, Aug 20, 2020 at 05:36:52PM +0200, Thomas Lamprecht wrote:
> On 30.07.20 12:18, Dominic Jäger wrote:
> > --- a/src/window/Edit.js
> > +++ b/src/window/Edit.js
> > @@ -134,6 +134,10 @@ Ext.define('Proxmox.window.Edit', {
> > + if (me.isImport) {
> > + url = url.replace('config', 'importdisk');
> > + }
> I'd rather avoid doing this here, i.e., the common shared code should not
> do such transforming things specific for a single use case downstream..
> That adds coupling, which should be avoided if possible.
>
> Why can the import window instance not handle this?
>
> sorry to catch this only now..
>
This was the first way that I found that resulted in a working prototype. And
I wasn't sure if this is actually the right direction for this patch, so I left
it like that for the moment.
I'll think of a better way.
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [pve-devel] [PATCH widget-toolkit v2 1/3] EditWindow: Change url to 'importdisk' for import
2020-08-24 8:42 ` Dominic Jäger
@ 2020-08-25 9:31 ` Dominic Jäger
0 siblings, 0 replies; 7+ messages in thread
From: Dominic Jäger @ 2020-08-25 9:31 UTC (permalink / raw)
To: Thomas Lamprecht; +Cc: Proxmox VE development discussion
I think that doing this without changing anything in the shared code is not
trivial. So it's still transforming the url [0], but not specific to the
import function anymore.
Of course I am still open for other approaches that I haven't seen yet :)
[0] https://lists.proxmox.com/pipermail/pve-devel/2020-August/044807.html
On Mon, Aug 24, 2020 at 10:42:02AM +0200, Dominic Jäger wrote:
> On Thu, Aug 20, 2020 at 05:36:52PM +0200, Thomas Lamprecht wrote:
> > On 30.07.20 12:18, Dominic Jäger wrote:
> > > --- a/src/window/Edit.js
> > > +++ b/src/window/Edit.js
> > > @@ -134,6 +134,10 @@ Ext.define('Proxmox.window.Edit', {
> > > + if (me.isImport) {
> > > + url = url.replace('config', 'importdisk');
> > > + }
> > I'd rather avoid doing this here, i.e., the common shared code should not
> > do such transforming things specific for a single use case downstream..
> > That adds coupling, which should be avoided if possible.
> >
> > Why can the import window instance not handle this?
> >
> > sorry to catch this only now..
> >
> I'll think of a better way.
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-08-25 9:32 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-07-30 10:18 [pve-devel] [PATCH widget-toolkit v2 0/3] Add GUI for importdisk 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 ` [pve-devel] [PATCH manager v2 2/3] Hardware View: Add GUI for importdisk Dominic Jäger
2020-07-30 10:18 ` [pve-devel] [PATCH qemu-server v2 3/3] Move importdisk from qm to API Dominic Jäger
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal