From: Alexandre Derumier <aderum...@odiso.com>

- 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  | 26 +++++++++++++++++-
 PVE/QemuServer.pm | 82 ++++++++++++++++---------------------------------------
 2 files changed, 49 insertions(+), 59 deletions(-)

diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index fae2872..a19ad87 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -64,7 +64,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']);
@@ -131,6 +133,28 @@ my $create_disks = sub {
        if (!$volid || $volid eq 'none' || $volid eq 'cdrom') {
            delete $disk->{size};
            $res->{$ds} = PVE::QemuServer::print_drive($vmid, $disk);
+       } 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+)?)$/) {
            my ($storeid, $size) = ($2 || $default_storage, $3);
            die "no storage ID specified (and no default storage)\n" if 
!$storeid;
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 2e9717c..7bdb655 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -746,8 +746,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 {
@@ -759,7 +757,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|/|;
@@ -3208,8 +3206,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"});
@@ -6420,23 +6416,6 @@ sub scsihw_infos {
     return ($maxdev, $controller, $controller_prefix);
 }
 
-# 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 {
     
@@ -6468,52 +6447,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.1.4


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

Reply via email to