[pve-devel] [PATCH 5/5] cloudinit : support any storeid for configdrive
Wolfgang Bumiller
w.bumiller at proxmox.com
Wed Jul 8 08:42:21 CEST 2015
> + if( $scfg->{path}) {
> + $name .= ".qcow2";
> + $fmt = 'qcow2';
> + }else{
> + $fmt = 'raw';
> + }
Shouldn't a '.raw' suffix be added too? And I still don't understand why
$scfg->{path} is the condition here?
And I'm getting `unable to parse directory volume name 'cloudinit'` as
error now when trying to start a VM with cloudinit.
(This is why I wasn't using just cloudinit as a name yet, because it
needs to be taken into account in many more places.)
On Tue, Jul 07, 2015 at 09:14:37AM +0200, Alexandre Derumier wrote:
> - 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 <aderumier at 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..ad0190c 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 = $2 || $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 387f385..28b34d3 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -745,8 +745,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 {
> @@ -758,7 +756,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|/|;
> @@ -3201,8 +3199,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"});
> @@ -6413,23 +6409,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 {
>
> @@ -6461,52 +6440,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 at pve.proxmox.com
> http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>
More information about the pve-devel
mailing list