[pve-devel] [PATCH qemu-server] Fix #2041, #2272 Add spice enhancements

Aaron Lauterer a.lauterer at proxmox.com
Mon Aug 19 13:36:13 CEST 2019


I finally found some time to look into this. Answers are inline.

On 8/12/19 5:34 PM, Thomas Lamprecht wrote:
> Am 7/29/19 um 10:59 AM schrieb Aaron Lauterer:
>> This adds a new config option called `spice_enhancements` and two
>> settings for it:
>>
>> * videostreaming
>> * foldersharing
>>
>> Signed-off-by: Aaron Lauterer <a.lauterer at proxmox.com>
>> ---
>>
>> Feedback is appreciated, especially regarding:
>>
>> * naming of the new config option
>> * design of the `conf_has_spice_enhancements` method
>>    * general structure with different returns
>>    * ternary operator
>>
>> PVE/QemuServer.pm | 47 ++++++++++++++++++++++++++++++++++++++++++++++-
>>   1 file changed, 46 insertions(+), 1 deletion(-)
>>
>> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
>> index 8c519b5..693c33b 100644
>> --- a/PVE/QemuServer.pm
>> +++ b/PVE/QemuServer.pm
>> @@ -295,6 +295,19 @@ my $audio_fmt = {
>>       },
>>   };
>>   
>> +my $spice_enhancements_fmt = {
>> +    foldersharing => {
>> +	type => 'boolean',
>> +	optional => 1,
>> +	description =>  "Enable folder sharing via SPICE."
>> +    },
>> +    videostreaming =>  {
>> +	type => 'boolean',
>> +	optional => 1,
>> +	description => "Enable video streaming. (Better performance but compression)"
>> +    },
>> +};
>> +
>>   my $confdesc = {
>>       onboot => {
>>   	optional => 1,
>> @@ -672,6 +685,12 @@ EODESCR
>>   	description => "Configure a audio device, useful in combination with QXL/Spice.",
>>   	optional => 1
>>       },
>> +    spice_enhancements => {
>> +	type => 'string',
>> +	format => $spice_enhancements_fmt,
>> +	description => "Configure additional enhancements for SPICE.",
>> +	optional => 1
>> +    },
>>   };
>>   
>>   my $cicustom_fmt = {
>> @@ -3454,6 +3473,26 @@ sub vga_conf_has_spice {
>>       return $1 || 1;
>>   }
>>   
>> +sub conf_has_spice_enhancements {
>> +    my ($conf) = @_;
>> +
>> +    if ($conf->{spice_enhancements}) {
>> +	my $enhancements = PVE::JSONSchema::parse_property_string($spice_enhancements_fmt, $conf->{spice_enhancements});
>> +
>> +	my $videostreaming = ($enhancements->{videostreaming}) ? ',streaming-video=all' : '';
> 
> for me it's a bit strange that we add the "," here already, this adds
> tight coupling between this method and the caller below, which I really
> do not like. It seems a bit like an misguided effort to have not
> everything in config_to_command, which itself is appreciated, but adds
> so much coupling that now we're even worse off, as it suggests this
> is a independent function, but it's not. It's very dependent on how
> the caller uses its result in even a positional way, cannot be reused
> and doesn't abstract one full step or device of the config-to-command
> procedure away, only parts of that..
> 
> So either I'd:
> * move the whole device pushing in it's own method, e.g., called "assemble_spice_devices",
>    which gets just the config and the $pciaddr (the latter to avoid passing many
>    more parameters) as params and let it return a list of "devices" we then can
>    just pust to the @$devices list in config_to_command
> * omit this, as the single "real" thing it does it a call to "parse_property_string",
>    do that below and have less lines added in total and better code locality, and
>    the addition to config_to_command shouldn't be much bigger than now (2 - 3 lines)
Thanks for the hint. I will send a v2 with a better implementation.

> 
>> +
>> +	return {
>> +	    videostreaming => $videostreaming,
>> +	    foldersharing => $enhancements->{foldersharing},
>> +	}
>> +    } else {
>> +	return {
>> +	    videostreaming => '',
>> +	    foldersharing => 0,
>> +	};> +    }
>> +}
>> +
>>   my $host_arch; # FIXME: fix PVE::Tools::get_host_arch
>>   sub get_host_arch() {
>>       $host_arch = (POSIX::uname())[4] if !$host_arch;
>> @@ -3982,12 +4021,18 @@ sub config_to_command {
>>   	die "failed to get an ip address of type $pfamily for 'localhost'\n" if !@nodeaddrs;
>>   	my $localhost = PVE::Network::addr_to_ip($nodeaddrs[0]->{addr});
>>   	$spice_port = PVE::Tools::next_spice_port($pfamily, $localhost);
>> +	my $spiceenhancements = conf_has_spice_enhancements($conf);
> 
> I wrote above after I wrote this here, but I keep it maybe the comments help,
> or at least allow to get the next version of this in shape faster :)
> 
> can we please try to keep naming conventions a little bit in sync
> spice_enhancements (to match spice_ports)
> 
> or move the port allocation there too and name it $spice, so $spice->{port},
> $spice->{foldersharing}, ... could be used? Just an idea, but could make things
> slightly more readable (and move some lines away from "config_to_command")
> 
> There are a few other slightly strange things about the surrounding code,
> e.g., why us $spice_port declared outside the "if ($qxlnum)" branch if it's
> not used anywhere outside, why $localhost is added if we already have a module-
> wide $nodename available, ... So if you want to add a separate patch clearing that
> a bit up, it could be nice.

In my efforts to clean up this section of the code I ran into the 
following things:

Regarding $spice_port being declared outside the whole "if ($qlxnum)" 
branch: It is used in the return values of "config_to_command" if an 
array is returned. If we are going to leave it there we might want to 
add a small comment to let future us know right away why it is placed in 
this seemingly awkward location.

Regarding the "$nodename": The steps to get from $nodename to $localhost 
were added on purpose with commit 9115244. I do not want to touch this, 
therefore the easy part to clean up is to remove the definition of 
$nodename and rely on the module wide $nodename.



> 
>>   
>> -	push @$devices, '-spice', "tls-port=${spice_port},addr=$localhost,tls-ciphers=HIGH,seamless-migration=on";
>> +	push @$devices, '-spice', "tls-port=${spice_port},addr=$localhost,tls-ciphers=HIGH,seamless-migration=on$spiceenhancements->{videostreaming}";
>>   
>>   	push @$devices, '-device', "virtio-serial,id=spice$pciaddr";
>>   	push @$devices, '-chardev', "spicevmc,id=vdagent,name=vdagent";
>>   	push @$devices, '-device', "virtserialport,chardev=vdagent,name=com.redhat.spice.0";
>> +
>> +	if ($spiceenhancements->{foldersharing}) {
>> +	    push @$devices, '-chardev', "spiceport,id=foldershare,name=org.spice-space.webdav.0";
>> +	    push @$devices, '-device', "virtserialport,chardev=foldershare,name=org.spice-space.webdav.0";
>> +	}
>>       }
>>   
>>       # enable balloon by default, unless explicitly disabled
>>
> 



More information about the pve-devel mailing list