]> git.proxmox.com Git - qemu-server.git/commitdiff
api: allow listing custom and default CPU models
authorStefan Reiter <s.reiter@proxmox.com>
Mon, 4 May 2020 10:58:39 +0000 (12:58 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 6 May 2020 14:48:08 +0000 (16:48 +0200)
More API calls will follow for this path, for now add the 'index' call to
list all custom and default CPU models.

Any user can list the default CPU models, as these are public anyway, but
custom models are restricted to users with Sys.Audit on /nodes.

Signed-off-by: Stefan Reiter <s.reiter@proxmox.com>
PVE/API2/Qemu/CPU.pm [new file with mode: 0644]
PVE/API2/Qemu/Makefile
PVE/QemuServer/CPUConfig.pm

diff --git a/PVE/API2/Qemu/CPU.pm b/PVE/API2/Qemu/CPU.pm
new file mode 100644 (file)
index 0000000..b0bb32d
--- /dev/null
@@ -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;
index 20c2a6c6a92cd16119e4a34fc0a855b6c96de8d4..f4b7be68bfd1b58495a5f1b6761b43cb458ebdcd 100644 (file)
@@ -1,4 +1,4 @@
-SOURCES=Agent.pm
+SOURCES=Agent.pm CPU.pm
 
 .PHONY: install
 install:
index 61744dc560f1e97d90c7f59837cc650cfe8d3418..b884498c76b9521b5e349885068cadafd8ef0401 100644 (file)
@@ -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-/;