[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