api: add endpoint for parsing .ovf files

Co-developed-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Signed-off-by: Dominic Jäger <d.jaeger@proxmox.com>
[split into its own patch + minor improvements/style fixes]
Signed-off-by: Fabian Ebner <f.ebner@proxmox.com>
[renamed API handler, since it's not an index]
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
This commit is contained in:
Fabian Ebner 2022-03-17 12:31:03 +01:00 committed by Fabian Grünbichler
parent 62375438dc
commit 39051ac0df
3 changed files with 86 additions and 1 deletions

View File

@ -1,4 +1,4 @@
SOURCES=Agent.pm CPU.pm Machine.pm
SOURCES=Agent.pm CPU.pm Machine.pm OVF.pm
.PHONY: install
install:

53
PVE/API2/Qemu/OVF.pm Normal file
View File

@ -0,0 +1,53 @@
package PVE::API2::Qemu::OVF;
use strict;
use warnings;
use PVE::JSONSchema qw(get_standard_option);
use PVE::QemuServer::OVF;
use PVE::RESTHandler;
use base qw(PVE::RESTHandler);
__PACKAGE__->register_method ({
name => 'readovf',
path => '',
method => 'GET',
proxyto => 'node',
description => "Read an .ovf manifest.",
protected => 1,
parameters => {
additionalProperties => 0,
properties => {
node => get_standard_option('pve-node'),
manifest => {
description => "Path to .ovf manifest.",
type => 'string',
},
},
},
returns => {
type => 'object',
additionalProperties => 1,
properties => PVE::QemuServer::json_ovf_properties(),
description => "VM config according to .ovf manifest.",
},
code => sub {
my ($param) = @_;
my $manifest = $param->{manifest};
die "check for file $manifest failed - $!\n" if !-f $manifest;
my $parsed = PVE::QemuServer::OVF::parse_ovf($manifest);
my $result;
$result->{cores} = $parsed->{qm}->{cores};
$result->{name} = $parsed->{qm}->{name};
$result->{memory} = $parsed->{qm}->{memory};
my $disks = $parsed->{disks};
for my $disk (@$disks) {
$result->{$disk->{disk_address}} = $disk->{backing_file};
}
return $result;
}});
1;

View File

@ -2203,6 +2203,38 @@ sub json_config_properties {
return $prop;
}
# Properties that we can read from an OVF file
sub json_ovf_properties {
my $prop = {};
for my $device (PVE::QemuServer::Drive::valid_drive_names()) {
$prop->{$device} = {
type => 'string',
format => 'pve-volume-id-or-absolute-path',
description => "Disk image that gets imported to $device",
optional => 1,
};
}
$prop->{cores} = {
type => 'integer',
description => "The number of CPU cores.",
optional => 1,
};
$prop->{memory} = {
type => 'integer',
description => "Amount of RAM for the VM in MB.",
optional => 1,
};
$prop->{name} = {
type => 'string',
description => "Name of the VM.",
optional => 1,
};
return $prop;
}
# return copy of $confdesc_cloudinit to generate documentation
sub cloudinit_config_properties {