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

Thomas Lamprecht t.lamprecht at proxmox.com
Mon Aug 12 17:34:15 CEST 2019


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)

> +
> +	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.

>  
> -	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