diff --git a/PVE/API2/Qemu/CPU.pm b/PVE/API2/Qemu/CPU.pm new file mode 100644 index 00000000..b0bb32d1 --- /dev/null +++ b/PVE/API2/Qemu/CPU.pm @@ -0,0 +1,61 @@ +package PVE::API2::Qemu::CPU; + +use strict; +use warnings; + +use PVE::RESTHandler; +use PVE::JSONSchema qw(get_standard_option); +use PVE::QemuServer::CPUConfig; + +use base qw(PVE::RESTHandler); + +__PACKAGE__->register_method({ + name => 'index', + path => '', + method => 'GET', + description => 'List all custom and default CPU models.', + permissions => { + user => 'all', + description => 'Only returns custom models when the current user has' + . ' Sys.Audit on /nodes.', + }, + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node'), + }, + }, + returns => { + type => 'array', + items => { + type => 'object', + properties => { + name => { + type => 'string', + description => "Name of the CPU model. Identifies it for" + . " subsequent API calls. Prefixed with" + . " 'custom-' for custom models.", + }, + custom => { + type => 'boolean', + description => "True if this is a custom CPU model.", + }, + vendor => { + type => 'string', + description => "CPU vendor visible to the guest when this" + . " model is selected. Vendor of" + . " 'reported-model' in case of custom models.", + }, + }, + }, + links => [ { rel => 'child', href => '{name}' } ], + }, + code => sub { + my $rpcenv = PVE::RPCEnvironment::get(); + my $authuser = $rpcenv->get_user(); + my $include_custom = $rpcenv->check($authuser, "/nodes", ['Sys.Audit'], 1); + + return PVE::QemuServer::CPUConfig::get_cpu_models($include_custom); + }}); + +1; diff --git a/PVE/API2/Qemu/Makefile b/PVE/API2/Qemu/Makefile index 20c2a6c6..f4b7be68 100644 --- a/PVE/API2/Qemu/Makefile +++ b/PVE/API2/Qemu/Makefile @@ -1,4 +1,4 @@ -SOURCES=Agent.pm +SOURCES=Agent.pm CPU.pm .PHONY: install install: diff --git a/PVE/QemuServer/CPUConfig.pm b/PVE/QemuServer/CPUConfig.pm index 61744dc5..b884498c 100644 --- a/PVE/QemuServer/CPUConfig.pm +++ b/PVE/QemuServer/CPUConfig.pm @@ -293,6 +293,36 @@ sub write_config { $class->SUPER::write_config($filename, $cfg); } +sub get_cpu_models { + my ($include_custom) = @_; + + my $models = []; + + for my $default_model (keys %{$cpu_vendor_list}) { + push @$models, { + name => $default_model, + custom => 0, + vendor => $cpu_vendor_list->{$default_model}, + }; + } + + return $models if !$include_custom; + + my $conf = load_custom_model_conf(); + for my $custom_model (keys %{$conf->{ids}}) { + my $reported_model = $conf->{ids}->{$custom_model}->{'reported-model'}; + $reported_model //= $cpu_fmt->{'reported-model'}->{default}; + my $vendor = $cpu_vendor_list->{$reported_model}; + push @$models, { + name => "custom-$custom_model", + custom => 1, + vendor => $vendor, + }; + } + + return $models; +} + sub is_custom_model { my ($cputype) = @_; return $cputype =~ m/^custom-/;