[pve-devel] [PATCH 5/5] cloudinit : support any storeid for configdrive

Wolfgang Bumiller w.bumiller at proxmox.com
Wed Jul 8 08:46:06 CEST 2015


> And I'm getting `unable to parse directory volume name 'cloudinit'` as
> error now when trying to start a VM with cloudinit.

Nevermind this, was my fault.

> On July 8, 2015 at 8:42 AM Wolfgang Bumiller <w.bumiller at proxmox.com> wrote:
> 
> 
> > +	    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
> > 
> 
> _______________________________________________
> 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