]> git.proxmox.com Git - qemu-server.git/blame - PVE/QemuServer/Machine.pm
config: parse: also warn about invalid lines
[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
9471e48b
TL
9# Bump this for VM HW layout changes during a release (where the QEMU machine
10# version stays the same)
ac0077cc 11our $PVE_MACHINE_VERSION = {
b8fb1c03 12 '4.1' => 2,
ac0077cc 13};
9471e48b 14
3392d6ca
SR
15sub machine_type_is_q35 {
16 my ($conf) = @_;
17
18 return $conf->{machine} && ($conf->{machine} =~ m/q35/) ? 1 : 0;
19}
20
21# this only works if VM is running
22sub get_current_qemu_machine {
23 my ($vmid) = @_;
24
25 my $res = PVE::QemuServer::Monitor::mon_cmd($vmid, 'query-machines');
26
9471e48b 27 my ($current, $pve_version, $default);
3392d6ca
SR
28 foreach my $e (@$res) {
29 $default = $e->{name} if $e->{'is-default'};
30 $current = $e->{name} if $e->{'is-current'};
9471e48b 31 $pve_version = $e->{'pve-version'} if $e->{'pve-version'};
3392d6ca
SR
32 }
33
9471e48b
TL
34 $current .= "+$pve_version" if $current && $pve_version;
35
3392d6ca
SR
36 # fallback to the default machine if current is not supported by qemu
37 return $current || $default || 'pc';
38}
39
9471e48b
TL
40# returns a string with major.minor+pve<VERSION>, patch version-part is ignored
41# as it's seldom ressembling a real QEMU machine type, so it would be '0' 99% of
42# the time anyway.. This explicitly separates pveversion from the machine.
2ea5fb7e 43sub extract_version {
9471e48b
TL
44 my ($machine_type, $kvmversion) = @_;
45
46 if (defined($machine_type) && $machine_type =~ m/^(?:pc(?:-i440fx|-q35)?|virt)-(\d+)\.(\d+)(?:\.(\d+))?(\+pve\d+)?/) {
47 my $versionstr = "$1.$2";
48 $versionstr .= $4 if $4;
49 return $versionstr;
50 } elsif (defined($kvmversion)) {
51 if ($kvmversion =~ m/^(\d+)\.(\d+)/) {
ac0077cc
SR
52 my $pvever = get_pve_version($kvmversion);
53 return "$1.$2+pve$pvever";
9471e48b 54 }
3392d6ca
SR
55 }
56
d1c1af4b 57 return;
3392d6ca
SR
58}
59
2ea5fb7e 60sub machine_version {
9471e48b 61 my ($machine_type, $major, $minor, $pve) = @_;
3392d6ca 62
2ea5fb7e 63 return PVE::QemuServer::Helpers::min_version(
9471e48b 64 extract_version($machine_type), $major, $minor, $pve);
3392d6ca
SR
65}
66
ac0077cc
SR
67sub get_pve_version {
68 my ($verstr) = @_;
69
70 if ($verstr =~ m/^(\d+\.\d+)/) {
71 return $PVE_MACHINE_VERSION->{$1} // 0;
72 }
73
74 die "internal error: cannot get pve version for invalid string '$verstr'";
75}
76
77sub can_run_pve_machine_version {
78 my ($machine_version, $kvmversion) = @_;
79
80 $machine_version =~ m/^(\d+)\.(\d+)(?:\+pve(\d+))$/;
81 my $major = $1;
82 my $minor = $2;
83 my $pvever = $3;
84
85 $kvmversion =~ m/(\d+)\.(\d+)/;
86 return 0 if PVE::QemuServer::Helpers::version_cmp($1, $major, $2, $minor) < 0;
87
88 # if $pvever is missing or 0, we definitely support it as long as we didn't
89 # fail the QEMU version check above
90 return 1 if !$pvever;
91
92 my $max_supported = get_pve_version("$major.$minor");
93 return 1 if $max_supported >= $pvever;
94
95 return 0;
96}
97
3392d6ca
SR
98# dies if a) VM not running or not exisiting b) Version query failed
99# So, any defined return value is valid, any invalid state can be caught by eval
100sub runs_at_least_qemu_version {
101 my ($vmid, $major, $minor, $extra) = @_;
102
103 my $v = PVE::QemuServer::Monitor::mon_cmd($vmid, 'query-version');
104 die "could not query currently running version for VM $vmid\n" if !defined($v);
105 $v = $v->{qemu};
106
825ae5bc 107 return PVE::QemuServer::Helpers::version_cmp($v->{major}, $major, $v->{minor}, $minor, $v->{micro}, $extra) >= 0;
3392d6ca
SR
108}
109
110sub qemu_machine_pxe {
111 my ($vmid, $conf) = @_;
112
113 my $machine = get_current_qemu_machine($vmid);
114
115 if ($conf->{machine} && $conf->{machine} =~ m/\.pxe$/) {
116 $machine .= '.pxe';
117 }
118
119 return $machine;
120}
121
1221;