[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