[pve-devel] [PATCH v2 qemu-server 04/11] refactor: create QemuSchema and move file/dir code

Fabian Grünbichler f.gruenbichler at proxmox.com
Wed Oct 30 11:39:02 CET 2019


On October 28, 2019 12:59 pm, Stefan Reiter wrote:
> Also merge the 'mkdir's from QemuServer and QemuConfig to reduce
> duplication (both modules depend on QemuSchema anyway).
> 
> nodename() is still called in multiple modules, but since it's cached by
> the INotify module it doesn't really matter.
> 
> Signed-off-by: Stefan Reiter <s.reiter at proxmox.com>
> ---
> 
> QemuSchema is pretty small right now, but it could hold much more of the static
> setup code from QemuServer.pm (JSONSchema formats and the like). This patch only
> moves the necessary stuff for the rest of the series to not need cyclic depends.
> 
> I want to refactor more into this in the future, but for now I'd like to wait
> for my CPU series, since that also touches some schema stuff.

I get where you are coming from here (and splitting the schema 
definition from all the stuff implemented in QemuServer.pm would be a 
huge win!), but IMHO the three methods you move here are not really 
schema-related - they are just VMID to local path mappings? is there 
some other broader category that we could put them into (except some 
awful generic 'helper' module ;)) ?

> 
>  PVE/CLI/qm.pm     |  3 ++-
>  PVE/Makefile      |  3 ++-
>  PVE/QMPClient.pm  |  5 +++--
>  PVE/QemuConfig.pm | 10 ++--------
>  PVE/QemuSchema.pm | 35 +++++++++++++++++++++++++++++++++++
>  PVE/QemuServer.pm | 41 ++++++++---------------------------------
>  6 files changed, 52 insertions(+), 45 deletions(-)
>  create mode 100644 PVE/QemuSchema.pm
> 
> diff --git a/PVE/CLI/qm.pm b/PVE/CLI/qm.pm
> index ea74ad5..44beac9 100755
> --- a/PVE/CLI/qm.pm
> +++ b/PVE/CLI/qm.pm
> @@ -21,6 +21,7 @@ use PVE::RPCEnvironment;
>  use PVE::Exception qw(raise_param_exc);
>  use PVE::Network;
>  use PVE::GuestHelpers;
> +use PVE::QemuSchema;
>  use PVE::QemuServer;
>  use PVE::QemuServer::ImportDisk;
>  use PVE::QemuServer::OVF;
> @@ -209,7 +210,7 @@ __PACKAGE__->register_method ({
>  	my ($param) = @_;
>  
>  	my $vmid = $param->{vmid};
> -	my $vnc_socket = PVE::QemuServer::vnc_socket($vmid);
> +	my $vnc_socket = PVE::QemuSchema::vnc_socket($vmid);
>  
>  	if (my $ticket = $ENV{LC_PVE_TICKET}) {  # NOTE: ssh on debian only pass LC_* variables
>  	    PVE::QemuServer::vm_mon_cmd($vmid, "change", device => 'vnc', target => "unix:$vnc_socket,password");
> diff --git a/PVE/Makefile b/PVE/Makefile
> index dc17368..5ec715e 100644
> --- a/PVE/Makefile
> +++ b/PVE/Makefile
> @@ -2,7 +2,8 @@ PERLSOURCE = 			\
>  	QemuServer.pm		\
>  	QemuMigrate.pm		\
>  	QMPClient.pm		\
> -	QemuConfig.pm
> +	QemuConfig.pm		\
> +	QemuSchema.pm		\
>  
>  .PHONY: install
>  install:
> diff --git a/PVE/QMPClient.pm b/PVE/QMPClient.pm
> index 570dba2..188c6d7 100644
> --- a/PVE/QMPClient.pm
> +++ b/PVE/QMPClient.pm
> @@ -2,6 +2,7 @@ package PVE::QMPClient;
>  
>  use strict;
>  use warnings;
> +use PVE::QemuSchema;
>  use PVE::QemuServer;
>  use IO::Multiplex;
>  use POSIX qw(EINTR EAGAIN);
> @@ -58,7 +59,7 @@ my $push_cmd_to_queue = sub {
>  
>      my $qga = ($execute =~ /^guest\-+/) ? 1 : 0;
>  
> -    my $sname = PVE::QemuServer::qmp_socket($vmid, $qga);
> +    my $sname = PVE::QemuSchema::qmp_socket($vmid, $qga);
>  
>      $self->{queue_info}->{$sname} = { qga => $qga, vmid => $vmid, sname => $sname, cmds => [] }
>          if !$self->{queue_info}->{$sname};
> @@ -186,7 +187,7 @@ my $open_connection = sub {
>      my $vmid = $queue_info->{vmid};
>      my $qga = $queue_info->{qga};
>  
> -    my $sname = PVE::QemuServer::qmp_socket($vmid, $qga);
> +    my $sname = PVE::QemuSchema::qmp_socket($vmid, $qga);
>  
>      $timeout = 1 if !$timeout;
>  
> diff --git a/PVE/QemuConfig.pm b/PVE/QemuConfig.pm
> index e9796a3..b63e57c 100644
> --- a/PVE/QemuConfig.pm
> +++ b/PVE/QemuConfig.pm
> @@ -5,6 +5,7 @@ use warnings;
>  
>  use PVE::AbstractConfig;
>  use PVE::INotify;
> +use PVE::QemuSchema;
>  use PVE::QemuServer;
>  use PVE::Storage;
>  use PVE::Tools;
> @@ -13,13 +14,6 @@ use base qw(PVE::AbstractConfig);
>  
>  my $nodename = PVE::INotify::nodename();
>  
> -mkdir "/etc/pve/nodes/$nodename";
> -my $confdir = "/etc/pve/nodes/$nodename/qemu-server";
> -mkdir $confdir;
> -
> -my $lock_dir = "/var/lock/qemu-server";
> -mkdir $lock_dir;
> -
>  my $MAX_UNUSED_DISKS = 256;
>  
>  # BEGIN implemented abstract methods from PVE::AbstractConfig
> @@ -37,7 +31,7 @@ sub __config_max_unused_disks {
>  sub config_file_lock {
>      my ($class, $vmid) = @_;
>  
> -    return "$lock_dir/lock-$vmid.conf";
> +    return "$PVE::QemuSchema::lock_dir/lock-$vmid.conf";
>  }
>  
>  sub cfs_config_path {
> diff --git a/PVE/QemuSchema.pm b/PVE/QemuSchema.pm
> new file mode 100644
> index 0000000..446177d
> --- /dev/null
> +++ b/PVE/QemuSchema.pm
> @@ -0,0 +1,35 @@
> +package PVE::QemuSchema;
> +
> +use strict;
> +use warnings;
> +
> +use PVE::INotify;
> +
> +my $nodename = PVE::INotify::nodename();
> +mkdir "/etc/pve/nodes/$nodename";
> +my $confdir = "/etc/pve/nodes/$nodename/qemu-server";
> +mkdir $confdir;
> +
> +our $var_run_tmpdir = "/var/run/qemu-server";
> +mkdir $var_run_tmpdir;
> +
> +our $lock_dir = "/var/lock/qemu-server";
> +mkdir $lock_dir;
> +
> +sub qmp_socket {
> +    my ($vmid, $qga) = @_;
> +    my $sockettype = $qga ? 'qga' : 'qmp';
> +    return "${var_run_tmpdir}/$vmid.$sockettype";
> +}
> +
> +sub pidfile_name {
> +    my ($vmid) = @_;
> +    return "${var_run_tmpdir}/$vmid.pid";
> +}
> +
> +sub vnc_socket {
> +    my ($vmid) = @_;
> +    return "${var_run_tmpdir}/$vmid.vnc";
> +}
> +
> +1;
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index 9af690a..817394e 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -40,6 +40,7 @@ use PVE::Tools qw(run_command lock_file lock_file_full file_read_firstline dir_g
>  
>  use PVE::QMPClient;
>  use PVE::QemuConfig;
> +use PVE::QemuSchema;
>  use PVE::QemuServer::Cloudinit;
>  use PVE::QemuServer::Memory;
>  use PVE::QemuServer::PCI qw(print_pci_addr print_pcie_addr print_pcie_root_port);
> @@ -108,16 +109,6 @@ sub cgroups_write {
>  
>  my $nodename = PVE::INotify::nodename();
>  
> -mkdir "/etc/pve/nodes/$nodename";
> -my $confdir = "/etc/pve/nodes/$nodename/qemu-server";
> -mkdir $confdir;
> -
> -my $var_run_tmpdir = "/var/run/qemu-server";
> -mkdir $var_run_tmpdir;
> -
> -my $lock_dir = "/var/lock/qemu-server";
> -mkdir $lock_dir;
> -
>  my $cpu_vendor_list = {
>      # Intel CPUs
>      486 => 'GenuineIntel',
> @@ -2995,7 +2986,7 @@ sub check_running {
>      die "unable to find configuration file for VM $vmid - no such machine\n"
>  	if !$nocheck && ! -f $filename;
>  
> -    my $pidfile = pidfile_name($vmid);
> +    my $pidfile = PVE::QemuSchema::pidfile_name($vmid);
>  
>      if (my $fd = IO::File->new("<$pidfile")) {
>  	my $st = stat($fd);
> @@ -3024,7 +3015,7 @@ sub vzlist {
>  
>      my $vzlist = config_list();
>  
> -    my $fd = IO::Dir->new($var_run_tmpdir) || return $vzlist;
> +    my $fd = IO::Dir->new($PVE::QemuSchema::var_run_tmpdir) || return $vzlist;
>  
>      while (defined(my $de = $fd->read)) {
>  	next if $de !~ m/^(\d+)\.pid$/;
> @@ -3564,7 +3555,7 @@ sub config_to_command {
>  
>      my $use_virtio = 0;
>  
> -    my $qmpsocket = qmp_socket($vmid);
> +    my $qmpsocket = PVE::QemuSchema::qmp_socket($vmid);
>      push @$cmd, '-chardev', "socket,id=qmp,path=$qmpsocket,server,nowait";
>      push @$cmd, '-mon', "chardev=qmp,mode=control";
>  
> @@ -3573,7 +3564,7 @@ sub config_to_command {
>  	push @$cmd, '-mon', "chardev=qmp-event,mode=control";
>      }
>  
> -    push @$cmd, '-pidfile' , pidfile_name($vmid);
> +    push @$cmd, '-pidfile' , PVE::QemuSchema::pidfile_name($vmid);
>  
>      push @$cmd, '-daemonize';
>  
> @@ -3854,7 +3845,7 @@ sub config_to_command {
>  
>      if ($vga->{type} && $vga->{type} !~ m/^serial\d+$/ && $vga->{type} ne 'none'){
>  	push @$devices, '-device', print_vga_device($conf, $vga, $arch, $machine_type, undef, $qxlnum, $bridges);
> -	my $socket = vnc_socket($vmid);
> +	my $socket = PVE::QemuSchema::vnc_socket($vmid);
>  	push @$cmd,  '-vnc', "unix:$socket,password";
>      } else {
>  	push @$cmd, '-vga', 'none' if $vga->{type} eq 'none';
> @@ -3905,7 +3896,7 @@ sub config_to_command {
>      push @$cmd, '-k', $conf->{keyboard} if defined($conf->{keyboard});
>  
>      if (parse_guest_agent($conf)->{enabled}) {
> -	my $qgasocket = qmp_socket($vmid, 1);
> +	my $qgasocket = PVE::QemuSchema::qmp_socket($vmid, 1);
>  	my $pciaddr = print_pci_addr("qga0", $bridges, $arch, $machine_type);
>  	push @$devices, '-chardev', "socket,path=$qgasocket,server,nowait,id=qga0";
>  	push @$devices, '-device', "virtio-serial,id=qga0$pciaddr";
> @@ -4119,11 +4110,6 @@ sub config_to_command {
>      return wantarray ? ($cmd, $vollist, $spice_port) : $cmd;
>  }
>  
> -sub vnc_socket {
> -    my ($vmid) = @_;
> -    return "${var_run_tmpdir}/$vmid.vnc";
> -}
> -
>  sub spice_port {
>      my ($vmid) = @_;
>  
> @@ -4132,17 +4118,6 @@ sub spice_port {
>      return $res->{'tls-port'} || $res->{'port'} || die "no spice port\n";
>  }
>  
> -sub qmp_socket {
> -    my ($vmid, $qga) = @_;
> -    my $sockettype = $qga ? 'qga' : 'qmp';
> -    return "${var_run_tmpdir}/$vmid.$sockettype";
> -}
> -
> -sub pidfile_name {
> -    my ($vmid) = @_;
> -    return "${var_run_tmpdir}/$vmid.pid";
> -}
> -
>  sub vm_devices_list {
>      my ($vmid) = @_;
>  
> @@ -5581,7 +5556,7 @@ sub vm_qmp_command {
>  
>      eval {
>  	die "VM $vmid not running\n" if !check_running($vmid, $nocheck);
> -	my $sname = qmp_socket($vmid);
> +	my $sname = PVE::QemuSchema::qmp_socket($vmid);
>  	if (-e $sname) { # test if VM is reasonambe new and supports qmp/qga
>  	    my $qmpclient = PVE::QMPClient->new();
>  
> -- 
> 2.20.1
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
> 
> 




More information about the pve-devel mailing list