]> git.proxmox.com Git - qemu-server.git/blame - PVE/QemuServer/Machine.pm
refactor: split qemu_machine_feature_enabled
[qemu-server.git] / PVE / QemuServer / Machine.pm
CommitLineData
3392d6ca
SR
1package PVE::QemuServer::Machine;
2
3use strict;
4use warnings;
5
2ea5fb7e 6use PVE::QemuServer::Helpers;
3392d6ca
SR
7use PVE::QemuServer::Monitor;
8
3392d6ca
SR
9sub machine_type_is_q35 {
10 my ($conf) = @_;
11
12 return $conf->{machine} && ($conf->{machine} =~ m/q35/) ? 1 : 0;
13}
14
15# this only works if VM is running
16sub get_current_qemu_machine {
17 my ($vmid) = @_;
18
19 my $res = PVE::QemuServer::Monitor::mon_cmd($vmid, 'query-machines');
20
21 my ($current, $default);
22 foreach my $e (@$res) {
23 $default = $e->{name} if $e->{'is-default'};
24 $current = $e->{name} if $e->{'is-current'};
25 }
26
27 # fallback to the default machine if current is not supported by qemu
28 return $current || $default || 'pc';
29}
30
2ea5fb7e
SR
31sub extract_version {
32 my ($machine_type) = @_;
3392d6ca 33
2ea5fb7e
SR
34 if ($machine_type && $machine_type =~ m/^((?:pc(-i440fx|-q35)?|virt)-(\d+)\.(\d+))/) {
35 return "$3.$4";
3392d6ca
SR
36 }
37
2ea5fb7e 38 return undef;
3392d6ca
SR
39}
40
2ea5fb7e
SR
41sub machine_version {
42 my ($machine_type, $version_major, $version_minor) = @_;
3392d6ca 43
2ea5fb7e
SR
44 return PVE::QemuServer::Helpers::min_version(
45 extract_version($machine_type), $version_major, $version_minor);
3392d6ca
SR
46}
47
48# dies if a) VM not running or not exisiting b) Version query failed
49# So, any defined return value is valid, any invalid state can be caught by eval
50sub runs_at_least_qemu_version {
51 my ($vmid, $major, $minor, $extra) = @_;
52
53 my $v = PVE::QemuServer::Monitor::mon_cmd($vmid, 'query-version');
54 die "could not query currently running version for VM $vmid\n" if !defined($v);
55 $v = $v->{qemu};
56
57 return version_cmp($v->{major}, $major, $v->{minor}, $minor, $v->{micro}, $extra) >= 0;
58}
59
60sub qemu_machine_pxe {
61 my ($vmid, $conf) = @_;
62
63 my $machine = get_current_qemu_machine($vmid);
64
65 if ($conf->{machine} && $conf->{machine} =~ m/\.pxe$/) {
66 $machine .= '.pxe';
67 }
68
69 return $machine;
70}
71
721;