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

Thomas Lamprecht t.lamprecht at proxmox.com
Fri Apr 26 10:27:46 CEST 2019


Am 4/25/19 um 5:14 PM schrieb Christian Ebner:
> If a vdisk_create_base fails because the storage backend does not support the base image creation, it leaves behind the original disk image, this is correct. This should not create further problems. For such templates, the user gets a warning stating it is not possible to create a linked clone, only full clones are possible.
> 
> So the code simply mimics the current behavior, where the user restores to VM and then manually converts to template. This leads to the same result.

thanks for clarifying, applied!

> 
>> On April 24, 2019 at 7:56 PM Thomas Lamprecht <t.lamprecht at proxmox.com> wrote:
>>
>>
>> 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*$/)) {
>>>
>>
> 
> _______________________________________________
> 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