From: Thomas Lamprecht Date: Sun, 10 Mar 2024 18:25:34 +0000 (+0100) Subject: api: import-metadata: make warnings structured & merge ignored-volumes X-Git-Url: https://git.proxmox.com/?a=commitdiff_plain;h=1a94dceb6f60c49f3cd0a3ae00f2e023f01de207;p=pve-storage.git api: import-metadata: make warnings structured & merge ignored-volumes This allows the frontends to translate them and avoids somewhat duplicated info by having some warnings explicitly (ignored-volumes) while others are in the warnings array. By passing along the key and the value the frontend can also show the warnings in-line, e.g. by marking a disk-entry in a grid as having potential problems. Ideally we'd have a central list of known types used for the API return schema enum and to check when calling the $warn closure, but as we only got three warnings keep this as is and only add a comment. Signed-off-by: Thomas Lamprecht --- diff --git a/src/PVE/API2/Storage/Status.pm b/src/PVE/API2/Storage/Status.pm index e583313..8a99b77 100644 --- a/src/PVE/API2/Storage/Status.pm +++ b/src/PVE/API2/Storage/Status.pm @@ -738,12 +738,6 @@ __PACKAGE__->register_method({ optional => 1, description => 'Recognised network interfaces as `net$id` => { ...params } object.', }, - 'ignored-volumes' => { - type => 'object', - additionalProperties => 1, - optional => 1, - description => 'Volumes that are explicitly ignored, like e.g., CDROM drives on ESXi.', - }, 'warnings' => { type => 'array', description => 'List of known issues that can affect the import of a guest.' @@ -753,7 +747,24 @@ __PACKAGE__->register_method({ type => "object", additionalProperties => 1, properties => { - message => { + 'type' => { + description => 'What this warning is about.', + enum => [ + 'cdrom-image-ignored', + 'nvme-unsupported', + 'ovmf-with-lsi-unsupported', + 'serial-port-socket-only', + ], + type => 'string', + }, + 'key' => { + description => 'Related subject (config) key of warning.', + optional => 1, + type => 'string', + }, + 'value' => { + description => 'Related subject (config) value of warning.', + optional => 1, type => 'string', }, }, diff --git a/src/PVE/Storage/ESXiPlugin.pm b/src/PVE/Storage/ESXiPlugin.pm index b66c5a3..8d38989 100644 --- a/src/PVE/Storage/ESXiPlugin.pm +++ b/src/PVE/Storage/ESXiPlugin.pm @@ -921,10 +921,11 @@ sub get_create_args { my $create_disks = {}; my $create_net = {}; my $warnings = []; - my $ignored_volumes = {}; + # NOTE: all types must be added to the return schema of the import-metadata API endpoint my $warn = sub { - push @$warnings, { message => $_[0] }; + my ($type, %properties) = @_; + push @$warnings, { type => $type, %properties }; }; my ($cores, $sockets) = $self->cpu_info(); @@ -1008,7 +1009,8 @@ sub get_create_args { # We currently do not pass cdroms through via the esxi storage. # Users should adapt import these from the storages directly/manually. $create_args->{"${bus}${count}"} = "none,media=cdrom"; - $ignored_volumes->{"${bus}${count}"} = "$storeid:$path"; + # CD-ROM image will not get imported + $warn->('cdrom-image-ignored', key => "${bus}${count}", value => "$storeid:$path"); } else { $create_disks->{"${bus}${count}"} = "$storeid:$path"; } @@ -1018,10 +1020,10 @@ sub get_create_args { }; $self->for_each_disk($add_disk); if (@nvmes) { - $warn->("PVE currently does not support NVMe guest disks, they are converted to SCSI"); for my $nvme (@nvmes) { my ($slot, $file, $devtype, $kind) = @$nvme; - $add_disk->('nvme', $slot, $file, $devtype, $kind, 1); + $warn->('nvme-unsupported', key => "nvme${slot}", value => "$file"); + $add_disk->('scsi', $slot, $file, $devtype, $kind, 1); } } @@ -1033,7 +1035,8 @@ sub get_create_args { } else { $scsihw = 'virtio-scsi-single'; } - $warn->("OVMF is built without LSI drivers, scsi hardware was set to $scsihw"); + # OVMF is built without LSI drivers, scsi hardware was set to $scsihw + $warn->('ovmf-with-lsi-unsupported', key => 'scsihw', value => "$scsihw"); } } $create_args->{scsihw} = $scsihw; @@ -1057,7 +1060,7 @@ sub get_create_args { $self->for_each_serial(sub { my ($id, $serial) = @_; # currently we only support 'socket' type serials anyway - $warn->("serial ports are currently all mapped to sockets") if $serid == 0; + $warn->('serial-port-socket-only', key => "serial$serid"); $create_args->{"serial$serid"} = 'socket'; ++$serid; }); @@ -1068,7 +1071,6 @@ sub get_create_args { 'create-args' => $create_args, disks => $create_disks, net => $create_net, - 'ignored-volumes' => $ignored_volumes, warnings => $warnings, }; }