[pve-devel] [PATCH qemu] fix: #1075: Restore VM template to VM and try to convert to template.

Thomas Lamprecht t.lamprecht at proxmox.com
Wed Apr 24 19:56:11 CEST 2019


Am 4/19/19 um 12:06 PM schrieb Christian Ebner:
> The restore of a backup from a VM template will first restore the VM and then
> convert the restored VM back into a template.
> This automatically performes the steps of the current behaviour, where the user
> has to manually convert the restored VM back to a template.
> 
> Signed-off-by: Christian Ebner <c.ebner at proxmox.com>
> ---
>  PVE/API2/Qemu.pm  | 11 +++++++++--
>  PVE/QemuServer.pm |  1 -
>  2 files changed, 9 insertions(+), 3 deletions(-)
> 
> diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
> index 651f64f..f61e58e 100644
> --- a/PVE/API2/Qemu.pm
> +++ b/PVE/API2/Qemu.pm
> @@ -556,14 +556,21 @@ __PACKAGE__->register_method({
>  	    PVE::QemuConfig->check_protection($conf, $emsg);
>  
>  	    die "$emsg vm is running\n" if PVE::QemuServer::check_running($vmid);
> -	    die "$emsg vm is a template\n" if PVE::QemuConfig->is_template($conf);
>  
>  	    my $realcmd = sub {
>  		PVE::QemuServer::restore_archive($archive, $vmid, $authuser, {
>  		    storage => $storage,
>  		    pool => $pool,
>  		    unique => $unique,
> -		    bwlimit => $bwlimit, });
> +		    bwlimit => $bwlimit,
> +		});
> +		my $restored_conf = PVE::QemuConfig->load_config($vmid);
> +		# Convert restored VM to template if backup was VM template
> +		if (PVE::QemuConfig->is_template($restored_conf)) {
> +		    warn "Convert to template.\n";
> +		    eval { PVE::QemuServer::template_create($vmid, $restored_conf) };

hmm, at the moment we can only restore to all disks to a single target
storage, or? because the lack of cleanup inside template_create, if one
vdisk_create_base fails, may then not be a real problem often here, but
can still happen.. error handling is a bit hard to do arbitrary in this
case, thus it was probably left out in the first place.

Commit bbd560974af465b2d4d55e6528001e93d4962e06 changed the "die" if a
storage does not supports templating to just ignore it, as it then needs
to be full cloned, so yes your quite simple patch seems to do the right
thing™, need to rethink this a bit, seems almost to easy for the fact that
we actively didn't do it.. ^^

> +		    warn $@ if $@;
> +		}
>  
>  		PVE::AccessControl::add_vm_to_pool($vmid, $pool) if $pool;
>  
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index cd86fec..2ca5f6e 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -5904,7 +5904,6 @@ sub restore_update_config_line {
>      return if $line =~ m/^lock:/;
>      return if $line =~ m/^unused\d+:/;
>      return if $line =~ m/^parent:/;
> -    return if $line =~ m/^template:/; # restored VM is never a template
>  
>      my $dc = PVE::Cluster::cfs_read_file('datacenter.cfg');
>      if (($line =~ m/^(vlan(\d+)):\s*(\S+)\s*$/)) {
> 





More information about the pve-devel mailing list