[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