- changelog:
  - support any storage and not only qcow2

  - cloudinit drive volume no more generated at start.

    we can now enable|disable cloudinit with

    qm set vmid -(ide|sata)x  storeid:cloudinit
    qm set vmid -delete (ide|sata)x

Signed-off-by: Alexandre Derumier <aderum...@odiso.com>
---
 PVE/API2/Qemu.pm  | 28 ++++++++++++++++++-
 PVE/QemuServer.pm | 82 ++++++++++++++++---------------------------------------
 2 files changed, 51 insertions(+), 59 deletions(-)

diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index aa7c832..4c91f6f 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -63,7 +63,9 @@ my $check_storage_access = sub {
 
        my $volid = $drive->{file};
 
-       if (!$volid || $volid eq 'none') {
+       if (!$volid || ($volid eq 'none' || $volid eq 'cloudinit')) {
+           # nothing to check
+       } elsif ($volid =~ m/^(([^:\s]+):)?(cloudinit)$/) {
            # nothing to check
        } elsif ($isCDROM && ($volid eq 'cdrom')) {
            $rpcenv->check($authuser, "/", ['Sys.Console']);
@@ -162,6 +164,30 @@ my $create_disks = sub {
                eval { PVE::Tools::run_command($efidiskcmd); };
                my $err = $@;
                die "Copying of EFI Vars image failed: $err" if $err;
+           } elsif ($volid =~ m/^(?:([^:\s]+):)?cloudinit$/) {
+           my $storeid = $1 || $default_storage;
+           die "no storage ID specified (and no default storage)\n" if 
!$storeid;
+           my $scfg = PVE::Storage::storage_config($storecfg, $storeid);
+           my $name = "vm-$vmid-cloudinit";
+           my $fmt = undef;
+           if ($scfg->{path}) {
+               $name .= ".qcow2";
+               $fmt = 'qcow2';
+           } else{
+               $fmt = 'raw';
+           }
+           # FIXME: Reasonable size? qcow2 shouldn't grow if the space isn't 
used anyway?
+           my $cloudinit_iso_size = 5; # in MB
+           my $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid,
+                                                    $fmt, $name, 
$cloudinit_iso_size*1024);
+           $disk->{file} = $volid;
+           $disk->{media} = 'cdrom';
+           push @$vollist, $volid;
+           delete $disk->{format}; # no longer needed
+           $res->{$ds} = PVE::QemuServer::print_drive($vmid, $disk);
+
+        } elsif ($volid =~ m!^(([^/:\s]+):)?(\d+(\.\d+)?)$!) {
+
            } else {
                $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid,
                                                      $fmt, undef, 
$size*1024*1024);
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index c76a99c..cd61475 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -1260,8 +1260,6 @@ sub get_iso_path {
        return get_cdrom_path();
     } elsif ($cdrom eq 'none') {
        return '';
-    } elsif ($cdrom eq 'cloudinit') {
-       return "/tmp/cloudinit/$vmid/configdrive.iso";
     } elsif ($cdrom =~ m|^/|) {
        return $cdrom;
     } else {
@@ -1273,7 +1271,7 @@ sub get_iso_path {
 sub filename_to_volume_id {
     my ($vmid, $file, $media) = @_;
 
-     if (!($file eq 'none' || $file eq 'cdrom' || $file eq 'cloudinit' ||
+     if (!($file eq 'none' || $file eq 'cdrom' ||
          $file =~ m|^/dev/.+| || $file =~ m/^([^:]+):(.+)$/)) {
 
        return undef if $file =~ m|/|;
@@ -3401,8 +3399,6 @@ sub config_to_command {
        push @$devices, '-device', print_drivedevice_full($storecfg, $conf, 
$vmid, $drive, $bridges);
     });
 
-    generate_cloudinit_command($conf, $vmid, $storecfg, $bridges, $devices);
-
     for (my $i = 0; $i < $MAX_NETS; $i++) {
          next if !$conf->{"net$i"};
          my $d = parse_net($conf->{"net$i"});
@@ -6607,23 +6603,6 @@ sub nbd_stop {
     vm_mon_cmd($vmid, 'nbd-server-stop');
 }
 
-# FIXME: Reasonable size? qcow2 shouldn't grow if the space isn't used anyway?
-my $cloudinit_iso_size = 5; # in MB
-
-sub prepare_cloudinit_disk {
-    my ($vmid, $storeid) = @_;
-
-    my $storecfg = PVE::Storage::config();
-    my $imagedir = PVE::Storage::get_image_dir($storecfg, $storeid, $vmid);
-    my $iso_name = "vm-$vmid-cloudinit.qcow2";
-    my $iso_path = "$imagedir/$iso_name";
-    if (!-e $iso_path) {
-       # vdisk_alloc size is in K
-       PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, 'qcow2', 
$iso_name, $cloudinit_iso_size*1024);
-    }
-    return ($iso_path, 'qcow2');
-}
-
 # FIXME: also in LXCCreate.pm => move to pve-common
 sub next_free_nbd_dev {
     
@@ -6655,52 +6634,39 @@ sub commit_cloudinit_disk {
     die $err if $err;
 }
 
-sub find_cloudinit_storage {
-    my ($conf, $vmid) = @_;
-    foreach my $ds (keys %$conf) {
-       next if !valid_drivename($ds);
-       if ($conf->{$ds} =~ 
m@^(?:volume=)?([^:]+):\Q$vmid\E/vm-\Q$vmid\E-cloudinit\.qcow2@) {
-           return $1;
-       }
-    }
-    return undef;
-}
-
 sub generate_cloudinitconfig {
     my ($conf, $vmid) = @_;
 
-    my $storeid = find_cloudinit_storage($conf, $vmid);
-    return if !$storeid;
-
-    my $path = "/tmp/cloudinit/$vmid";
+    foreach_drive($conf, sub {
+        my ($ds, $drive) = @_;
 
-    mkdir "/tmp/cloudinit";
-    mkdir $path;
-    mkdir "$path/drive";
-    mkdir "$path/drive/openstack";
-    mkdir "$path/drive/openstack/latest";
-    mkdir "$path/drive/openstack/content";
-    my $digest_data = generate_cloudinit_userdata($conf, $path)
-                   . generate_cloudinit_network($conf, $path);
-    generate_cloudinit_metadata($conf, $path, $digest_data);
+       my ($storeid, $volname) = PVE::Storage::parse_volume_id($drive->{file}, 
1);
 
-    my ($iso_path, $format) = prepare_cloudinit_disk($vmid, $storeid);
-    commit_cloudinit_disk("$path/drive", $iso_path, $format);
-    rmtree("$path/drive");
-}
+       return if $volname !~ m/vm-$vmid-cloudinit/;
 
-sub generate_cloudinit_command {
-    my ($conf, $vmid, $storecfg, $bridges, $devices) = @_;
+       my $path = "/tmp/cloudinit/$vmid";
 
-    return if !$conf->{cloudinit};
+       mkdir "/tmp/cloudinit";
+       mkdir $path;
+       mkdir "$path/drive";
+       mkdir "$path/drive/openstack";
+       mkdir "$path/drive/openstack/latest";
+       mkdir "$path/drive/openstack/content";
+       my $digest_data = generate_cloudinit_userdata($conf, $path)
+                       . generate_cloudinit_network($conf, $path);
+       generate_cloudinit_metadata($conf, $path, $digest_data);
 
-    my $path = "/tmp/cloudinit/$vmid/configdrive.iso";
-    my $drive = parse_drive('ide3', 'cloudinit,media=cdrom');
-    my $drive_cmd = print_drive_full($storecfg, $vmid, $drive);
-    push @$devices, '-drive', $drive_cmd;
-    push @$devices, '-device', print_drivedevice_full($storecfg, $conf, $vmid, 
$drive, $bridges);
+       my $storecfg = PVE::Storage::config();
+       my $iso_path = PVE::Storage::path($storecfg, $drive->{file});
+       my $scfg = PVE::Storage::storage_config($storecfg, $storeid);
+       my $format = qemu_img_format($scfg, $volname);
+       #fixme : add meta as drive property to compare
+       commit_cloudinit_disk("$path/drive", $iso_path, $format);
+       rmtree("$path/drive");
+    });
 }
 
+
 sub generate_cloudinit_userdata {
     my ($conf, $path) = @_;
 
-- 
2.11.0

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

Reply via email to