]> git.proxmox.com Git - pve-storage.git/commitdiff
ovf: implement parsing out firmware type
authorDominik Csapak <d.csapak@proxmox.com>
Mon, 18 Nov 2024 15:29:08 +0000 (16:29 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Mon, 18 Nov 2024 17:35:54 +0000 (18:35 +0100)
it seems there is no part of the ovf standard that handles which type of
bios there is (at least i could not find it). Every ovf/ova i tested
either has no info about it, or has it in a vmware specific property
which we parse here.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
Reviewed-by: Fiona Ebner <f.ebner@proxmox.com>
src/PVE/GuestImport/OVF.pm
src/PVE/Storage/DirPlugin.pm
src/test/ovf_manifests/Win10-Liz_no_default_ns.ovf
src/test/run_ovf_tests.pl

index a760e1ef85c4cc612602e4ec4e0a9d58f9f37ee2..08e9d0f4ae8c97d922d5c8262c2bec4c335f1177 100644 (file)
@@ -228,6 +228,11 @@ sub parse_ovf {
     my $ostype_id = $xpc->findvalue($xpath_find_ostype_id);
     $qm->{ostype} = get_ostype($ostype_id);
 
+    # vmware specific firmware config, seems to not be standardized in ovf ?
+    my $xpath_find_firmware = "/ovf:Envelope/ovf:VirtualSystem/ovf:VirtualHardwareSection/vmw:Config[\@vmw:key=\"firmware\"]/\@vmw:value";
+    my $firmware = $xpc->findvalue($xpath_find_firmware) || 'seabios';
+    $qm->{bios} = 'ovmf' if $firmware eq 'efi';
+
     # disks metadata is split in four different xml elements:
     # * as an Item node of type DiskDrive in the VirtualHardwareSection
     # * as an Disk node in the DiskSection
index 04a04859e5671cc29de25f5cdd672cc9cf0ea0db..0c322422f20240c3333c22b0a4f05c4530a859a6 100644 (file)
@@ -282,6 +282,11 @@ sub get_import_metadata {
        };
     }
 
+    if (defined($res->{qm}->{bios}) && $res->{qm}->{bios} eq 'ovmf') {
+       $disks->{efidisk0} = 1;
+       push @$warnings, { type => 'efi-state-lost', key => 'bios', value => 'ovmf' };
+    }
+
     return {
        type => 'vm',
        source => $volname,
index b93540f4b7f179089c66c009f50f7931c155b762..10ccaf170dc8b281cd18b4aa86193c5486d81081 100755 (executable)
       <vmw:Config ovf:required="false" vmw:key="powerOpInfo.resetType" vmw:value="soft"/>
       <vmw:Config ovf:required="false" vmw:key="powerOpInfo.suspendType" vmw:value="soft"/>
       <vmw:Config ovf:required="false" vmw:key="tools.syncTimeWithHost" vmw:value="false"/>
+      <vmw:Config ovf:required="false" vmw:key="firmware" vmw:value="efi"/>
     </VirtualHardwareSection>
   </VirtualSystem>
 </Envelope>
index c433c9d6d4275afe1f764b445b47bbb85c763de5..e92258dfe21feb56ee741363e07eb69c74f22eae 100755 (executable)
@@ -72,5 +72,6 @@ is($win10noNs->{qm}->{memory}, '6144', 'win10 VM (no default rasd NS) memory is
 is($win10noNs->{qm}->{cores}, '4', 'win10 VM (no default rasd NS) cores are correct');
 # older esxi/ovf standard used 'other' for windows10
 is($win10noNs->{qm}->{ostype}, 'other', 'win10 VM (no default rasd NS) ostype is correct');
+is($win10noNs->{qm}->{bios}, 'ovmf', 'win10 VM (no default rasd NS) bios is correct');
 
 done_testing();