[pve-devel] [PATCH qemu-server v5 3/3] Add new qm option 'diskimport' to import external disk images

Fabian Grünbichler f.gruenbichler at proxmox.com
Tue May 30 10:17:16 CEST 2017


meta: this is not an "option" but a new "command" ;)

On Mon, May 22, 2017 at 10:34:47AM +0200, Emmanuel Kasper wrote:
> The VM must be already existing, and the syntax is
> 
> qm diskimport 421 minix204.img pve4tank
> 
> where 421 is an already existing VM
> ---
>  PVE/CLI/qm.pm | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 51 insertions(+)
> 
> diff --git a/PVE/CLI/qm.pm b/PVE/CLI/qm.pm
> index 44439dd..7c5b2c4 100755
> --- a/PVE/CLI/qm.pm
> +++ b/PVE/CLI/qm.pm
> @@ -17,6 +17,7 @@ use PVE::SafeSyslog;
>  use PVE::INotify;
>  use PVE::RPCEnvironment;
>  use PVE::QemuServer;
> +use PVE::QemuServer::ImportDisk;
>  use PVE::API2::Qemu;
>  use JSON;
>  use PVE::JSONSchema qw(get_standard_option);
> @@ -380,6 +381,54 @@ __PACKAGE__->register_method ({
>      }});
>  
>  __PACKAGE__->register_method ({
> +    name => 'importdisk',
> +    path => 'importdisk',
> +    method => 'POST',
> +    description => "Import an external disk image as an unused disk in a VM. The
> + image format has to be supported by qemu-img(1).",
> +    parameters => {
> +	additionalProperties => 0,
> +	properties => {
> +	    vmid => get_standard_option('pve-vmid', {completion => \&PVE::QemuServer::complete_vmid}),
> +	    source => {
> +		description => 'Path to the disk image to import',
> +		type => 'string',
> +		optional => 0,
> +	    },
> +            storage => get_standard_option('pve-storage-id', {
> +		description => 'Target storage ID',
> +		completion => \&PVE::QemuServer::complete_storage,
> +		optional => 0,
> +            }),
> +	    format => {
> +		type => 'string',
> +		description => 'Target format',
> +		enum => [ 'raw', 'qcow2', 'vmdk' ],
> +		optional => 1,
> +	    },
> +	},
> +    },
> +    returns => { type => 'null'},
> +    code => sub {
> +	my ($param) = @_;
> +
> +	my $vmid = extract_param($param, 'vmid');
> +	my $source = extract_param($param, 'source');
> +	my $storeid = extract_param($param, 'storage');
> +	my $format = extract_param($param, 'format');
> +
> +	my $vm_conf = PVE::QemuConfig->load_config($vmid);
> +	PVE::QemuConfig->check_lock($vm_conf);
> +	-f $source or die "$source: non-existent or non-regular file\n";

this is uncommon style for our code base.. usually we'd do

die "foo" if ! -f $bar;

or

die "rather long foo which needs its own line.."
    if ! -f $bar;

this also makes skimming code for parts where it can error out easier
(because you just have to look for lines starting with "die" ;)

(also, lines starting with '-' are ugly :P)

> +	my $storecfg = PVE::Storage::config();
> +	PVE::Storage::storage_check_enabled($storecfg, $storeid);
> +
> +	PVE::QemuServer::ImportDisk::do_import($source, $vmid, $storeid, { format => $format });
> +
> +	return undef;
> +    }});
> +
> +__PACKAGE__->register_method ({
>      name => 'terminal',
>      path => 'terminal',
>      method => 'POST',
> @@ -587,6 +636,8 @@ our $cmddef = {
>      nbdstop => [ __PACKAGE__, 'nbdstop', ['vmid']],
>  
>      terminal => [ __PACKAGE__, 'terminal', ['vmid']],
> +
> +    importdisk => [ __PACKAGE__, 'importdisk', ['vmid', 'source', 'storage']],
>  };
>  
>  1;
> -- 
> 2.11.0
> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel




More information about the pve-devel mailing list