Signed-off-by: Fabian Ebner <f.eb...@proxmox.com>
---

For VMs this already happens.

When adding volumes to templates no such conversion to
base images happens yet (affects both VM/LXC). Because
templates are more-or-less supposed to be read-only it
probably makes sense to disallow adding volumes altogether.
Or should we bother and do conversion instead?

When a volume with linked clones is moved with 'delete source'
then the volume will be copied over and the source volume does
not get deleted, but the source volume disappears from the config.
With the second patch it gets added as an unused volume instead.

 src/PVE/API2/LXC.pm | 23 +++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/src/PVE/API2/LXC.pm b/src/PVE/API2/LXC.pm
index a5aa5fc..9eb52dc 100644
--- a/src/PVE/API2/LXC.pm
+++ b/src/PVE/API2/LXC.pm
@@ -468,6 +468,13 @@ __PACKAGE__->register_method({
        return $rpcenv->fork_worker($workername, $vmid, $authuser, $realcmd);
     }});
 
+sub assert_storeid_supports_templates {
+    my ($scfg, $sid) = @_;
+
+    die "Warning: Directory storage '$sid' does not support container 
templates!\n"
+       if $scfg->{ids}->{$sid}->{path};
+}
+
 sub check_storage_supports_templates {
     my ($conf) = @_;
 
@@ -477,8 +484,7 @@ sub check_storage_supports_templates {
            my ($ms, $mp) = @_;
 
            my ($sid) = PVE::Storage::parse_volume_id($mp->{volume}, 0);
-           die "Warning: Directory storage '$sid' does not support container 
templates!\n"
-               if $scfg->{ids}->{$sid}->{path};
+           assert_storeid_supports_templates($scfg, $sid);
        });
     };
     return $@
@@ -1805,6 +1811,8 @@ __PACKAGE__->register_method({
 
        my ($mpdata, $old_volid);
 
+       my $storage_cfg = PVE::Storage::config();
+
        PVE::LXC::Config->lock_config($vmid, sub {
            my $conf = PVE::LXC::Config->load_config($vmid);
            PVE::LXC::Config->check_lock($conf);
@@ -1823,6 +1831,8 @@ __PACKAGE__->register_method({
            die "you can't move a volume with snapshots and delete the source\n"
                if $param->{delete} && 
PVE::LXC::Config->is_volume_in_use_by_snapshots($conf, $old_volid);
 
+           assert_storeid_supports_templates($storage_cfg, $storage) if 
PVE::LXC::Config->is_template($conf);
+
            PVE::Tools::assert_if_modified($param->{digest}, $conf->{digest});
 
            PVE::LXC::Config->set_lock($vmid, $lockname);
@@ -1833,7 +1843,6 @@ __PACKAGE__->register_method({
                PVE::Cluster::log_msg('info', $authuser, "move volume CT $vmid: 
move --volume $mpkey --storage $storage");
 
                my $conf = PVE::LXC::Config->load_config($vmid);
-               my $storage_cfg = PVE::Storage::config();
 
                my $new_volid;
 
@@ -1843,7 +1852,13 @@ __PACKAGE__->register_method({
                    my $source_storage = 
PVE::Storage::parse_volume_id($old_volid);
                    my $movelimit = PVE::Storage::get_bandwidth_limit('move', 
[$source_storage, $storage], $bwlimit);
                    $new_volid = PVE::LXC::copy_volume($mpdata, $vmid, 
$storage, $storage_cfg, $conf, undef, $movelimit);
-                   $mpdata->{volume} = $new_volid;
+                   if (PVE::LXC::Config->is_template($conf)) {
+                       PVE::Storage::activate_volumes($storage_cfg, 
[$new_volid]);
+                       my $template_volid = 
PVE::Storage::vdisk_create_base($storage_cfg, $new_volid);
+                       $mpdata->{volume} = $template_volid;
+                   } else {
+                       $mpdata->{volume} = $new_volid;
+                   }
 
                    PVE::LXC::Config->lock_config($vmid, sub {
                        my $digest = $conf->{digest};
-- 
2.20.1


_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to