--- /dev/null
+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;
$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-/;