[pve-devel] applied: Re: [PATCH manager 2/2] use RealmCombobox from widget-toolkit
On 5/19/20 4:48 PM, Dominik Csapak wrote: > Signed-off-by: Dominik Csapak > --- > www/manager6/dc/UserEdit.js | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > applied, thanks! ___ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
[pve-devel] applied: Re: [PATCH manager 1/2] ui: use RoleSelector from widget-toolkit
On 5/19/20 4:48 PM, Dominik Csapak wrote: > Signed-off-by: Dominik Csapak > --- > www/manager6/Makefile | 1 - > www/manager6/dc/ACLView.js| 2 +- > www/manager6/form/RoleSelector.js | 50 --- > 3 files changed, 1 insertion(+), 52 deletions(-) > delete mode 100644 www/manager6/form/RoleSelector.js > > applied, thanks! ___ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
[pve-devel] [RFC manager 2/2] hardware view: Add disk import button
Is it a bad idea to move column2 as I did here? Seems strange to have column1 and 2 so different but I haven't found an easier way to make it available to the subclass yet. @Thomas Is this sort of what you had in mind for this feature? Signed-off-by: Dominic Jäger --- www/manager6/Makefile| 1 + www/manager6/form/DiskStorageSelector.js | 5 + www/manager6/qemu/HDEdit.js | 50 + www/manager6/qemu/HDImport.js| 128 +++ www/manager6/qemu/HardwareView.js| 13 +++ 5 files changed, 176 insertions(+), 21 deletions(-) create mode 100644 www/manager6/qemu/HDImport.js diff --git a/www/manager6/Makefile b/www/manager6/Makefile index a29e280d..c1645748 100644 --- a/www/manager6/Makefile +++ b/www/manager6/Makefile @@ -143,6 +143,7 @@ JSSRC= \ qemu/Smbios1Edit.js \ qemu/CDEdit.js \ qemu/HDEdit.js \ + qemu/HDImport.js\ qemu/HDResize.js\ qemu/HDMove.js \ qemu/HDEfi.js \ diff --git a/www/manager6/form/DiskStorageSelector.js b/www/manager6/form/DiskStorageSelector.js index 445e3ac0..2c1555e1 100644 --- a/www/manager6/form/DiskStorageSelector.js +++ b/www/manager6/form/DiskStorageSelector.js @@ -32,6 +32,11 @@ Ext.define('PVE.form.DiskStorageSelector', { // string because else we get a type confusion defaultSize: '32', +setDiskSize: function(newSize) { + let field = this.getComponent('disksize'); + field.setValue(newSize); +}, + changeStorage: function(f, value) { var me = this; var formatsel = me.getComponent('diskformat'); diff --git a/www/manager6/qemu/HDEdit.js b/www/manager6/qemu/HDEdit.js index fd890600..5d6c12e9 100644 --- a/www/manager6/qemu/HDEdit.js +++ b/www/manager6/qemu/HDEdit.js @@ -13,6 +13,28 @@ Ext.define('PVE.qemu.HDInputPanel', { viewModel: {}, +diskStorageSelector: { + xtype: 'pveDiskStorageSelector', + storageContent: 'images', + name: 'disk', + reference: 'storageSelector', +}, + +column2: [ + { + xtype: 'CacheTypeSelector', + name: 'cache', + value: '__default__', + fieldLabel: gettext('Cache') + }, + { + xtype: 'proxmoxcheckbox', + fieldLabel: gettext('Discard'), + reference: 'discard', + name: 'discard' + }, +], + controller: { xclass: 'Ext.app.ViewController', @@ -164,7 +186,6 @@ Ext.define('PVE.qemu.HDInputPanel', { me.drive = {}; me.column1 = []; - me.column2 = []; me.advancedColumn1 = []; me.advancedColumn2 = []; @@ -188,6 +209,8 @@ Ext.define('PVE.qemu.HDInputPanel', { me.column1.push(me.scsiController); } + me.diskStorageSelector.nodename = me.nodename; + me.diskStorageSelector.autoSelect = me.insideWizard; if (me.unused) { me.unusedDisks = Ext.create('Proxmox.form.KVComboBox', { name: 'unusedId', @@ -201,13 +224,7 @@ Ext.define('PVE.qemu.HDInputPanel', { }); me.column1.push(me.unusedDisks); } else if (me.isCreate) { - me.column1.push({ - xtype: 'pveDiskStorageSelector', - storageContent: 'images', - name: 'disk', - nodename: me.nodename, - autoSelect: me.insideWizard - }); + me.column1.push(me.diskStorageSelector); } else { me.column1.push({ xtype: 'textfield', @@ -219,18 +236,6 @@ Ext.define('PVE.qemu.HDInputPanel', { } me.column2.push( - { - xtype: 'CacheTypeSelector', - name: 'cache', - value: '__default__', - fieldLabel: gettext('Cache') - }, - { - xtype: 'proxmoxcheckbox', - fieldLabel: gettext('Discard'), - reference: 'discard', - name: 'discard' - } ); me.advancedColumn1.push( @@ -358,7 +363,9 @@ Ext.define('PVE.qemu.HDEdit', { backgroundDelay: 5, -initComponent : function() { +isImport: false, + +initComponent: function() { var me = this; var nodename = me.pveSelNode.data.node; @@ -374,6 +381,7 @@ Ext.define('PVE.qemu.HDEdit', { confid: me.confid, nodename: nodename, unused: unused, + isImport: me.isImport, isCreate: me.isCreate }); diff --git a/www/manager6/qemu/HDImport.js b/www/manager6/qemu/HDImport.js new file mode 100644
[pve-devel] [RFC qemu-server 1/2] Move importdisk from qm to API
I'd appreciate a few hints for the importdisk GUI feature. Yes or no to automatically adding the drive as active (not unused)? Signed-off-by: Dominic Jäger --- PVE/API2/Qemu.pm | 87 +++- PVE/CLI/qm.pm| 57 +-- PVE/QemuServer/ImportDisk.pm | 2 +- 3 files changed, 87 insertions(+), 59 deletions(-) diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm index fd51bf3..5e75605 100644 --- a/PVE/API2/Qemu.pm +++ b/PVE/API2/Qemu.pm @@ -23,6 +23,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; @@ -44,8 +45,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."; @@ -4203,4 +4202,88 @@ __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, +proxyto => 'node', +description => "Import an external disk image into a VM. + The image format has to be supported by qemu-img(1).", +permissions => { + description => "You need 'VM.Config.Disk' permissions on /vms/{vmid}, + and 'Datastore.AllocateSpace' permissions on the storage.", + check => [ 'and', + ['perm', '/vms/{vmid}', [ 'VM.Config.Disk' ]], + ['perm', '/storage/{storage}', [ 'Datastore.AllocateSpace' ]], + ], +}, +parameters => { + additionalProperties => 0, + properties => PVE::QemuServer::json_config_properties ({ + node => get_standard_option('pve-node'), + vmid => get_standard_option('pve-vmid', {completion => \::QemuServer::complete_vmid}), + source => { + description => 'Path to the disk image to import', + type => 'string', + optional => 0, + }, + format => { + type => 'string', + description => 'Target format', + enum => [ 'raw', 'qcow2', 'vmdk' ], + optional => 1, + }, + }), +}, +returns => { type => 'string'}, +code => sub { + my ($param) = @_; + print("start\n"); + + my $rpcenv = PVE::RPCEnvironment::get(); + my $authuser = $rpcenv->get_user(); + + my $node = extract_param($param, 'node'); + my $vmid = extract_param($param, 'vmid'); + my $source = extract_param($param, 'source'); + my $drive = extract_param($param, 'drive'); + my $format = extract_param($param, 'format'); + my $storecfg = PVE::Storage::config(); + + # TODO nice error message if drive is not reachable + my $check_replication = sub { }; # TODO implement me, maybe? + my $driveX; + foreach my $opt (keys %$param) { + die ("Die because multiple drives\n") if defined($driveX); + if (PVE::QemuServer::is_valid_drivename($opt)) { + # cleanup drive path + my $drive = PVE::QemuServer::parse_drive($opt, $param->{$opt}); + raise_param_exc({ $opt => "unable to parse drive options" }) if !$drive; + PVE::QemuServer::cleanup_drive_path($opt, $storecfg, $drive); + $check_replication->($drive); # TODO do I need this? + $param->{$opt} = PVE::QemuServer::print_drive($drive); + die "$source: non-existent or non-regular file\n" if (! -f $source); + $driveX = $drive; + } + } + $drive = $driveX; + + my $message = $drive ? "to drive $drive->{'file'} on" : 'as unused drive to'; + print "Importing disk '$source' " . $message . " VM $vmid ...\n"; + my $worker = sub { + eval { + my $dn = "$drive->{'interface'}$drive->{'index'}"; + print("before import dn is $dn\n"); + my ($storeid) = $drive->{'file'} =~ /^(.*):/; + print("storeid before import is $storeid\n"); + my ($drive_id, $volid) = PVE::QemuServer::ImportDisk::do_import( + $source, $vmid, $storeid, { format => $format, drive_name => $dn }); + print "Successfully imported disk '$source' as '$drive_id: $volid'\n"; + }; + die "Importing disk failed: $@\n" if $@; + }; + return $rpcenv->fork_worker('importdisk', $vmid, $authuser, $worker); +}}); + 1; diff --git a/PVE/CLI/qm.pm
[pve-devel] ceph octopus rbd benchmark
Hi, I have done some benchmark with librbd octopus, results are really great with new the write-around cache policy. (Simply need to enable cache=writeback in qemu) Here some iops result with 1vm - 1disk - 4k block iodepth=64, librbd, no iothread. nautilus-cache=none nautilus-cache=writeback octopus-cache=none octopus-cache=writeback randread 4k 62.1k 25.2k 61.1k 60.8k randwrite 4k 27.7k 19.5k 34.5k 53.0k seqwrite 4k 7850 37.5k 24.9k 82.6k We don't have anymore read degradation with cache=writeback, and write performance is around 2,5x faster ! I think that when octopus will be ready for proxmox6, we could advise user to change the disk cache to writeback. (and maybe select it as default in gui when an rbd storage is used for a new vm isk) ___ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel