]> git.proxmox.com Git - pve-storage.git/commitdiff
api: import-metadata: make warnings structured & merge ignored-volumes
authorThomas Lamprecht <t.lamprecht@proxmox.com>
Sun, 10 Mar 2024 18:25:34 +0000 (19:25 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 13 Mar 2024 14:29:35 +0000 (15:29 +0100)
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 <t.lamprecht@proxmox.com>
src/PVE/API2/Storage/Status.pm
src/PVE/Storage/ESXiPlugin.pm

index e583313b0c88589bab4f314924494078480fc8c2..8a99b7743f5488c961fed63c271d6e1ad3e34373 100644 (file)
@@ -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',
                        },
                    },
index b66c5a3ecc54fa23fcbce88430e3f3877e1c189f..8d389898a1ef0cbbdd4a408d8908d6450f8d00b9 100644 (file)
@@ -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,
     };
 }