[pve-devel] [PATCH v11 cloudinit 9/9] cloudinit 'hotplug'

Alexandre DERUMIER aderumier at odiso.com
Tue Aug 25 05:33:08 CEST 2015


Hi,

>>my $cloudinit_iso_size = 5; # in MB 
>>+ eval { # delete old images if they exist 
>>+ PVE::Storage::vdisk_free($storecfg, "$storeid:$vmid/$name"); 
>>+ }; # ignore errors 


This does not work with rbd backends,

removing the eval give me:


# qm set 132 -ide0 ceph1:cloudinit
update VM 132: -ide0 ceph1:cloudinit
unable to parse rbd volume name '132/vm-132-cloudinit'


The correct format is "vm-132-cloudinit".

I think you should format "$storeid:$vmid/$name", manually.
Storage plugin should give us the right volid.
(but they are no method currently, volid is only generate on allocation).

Maybe another way could be to add a new argument to PVE::Storage::vdisk_alloc,

like "overwrite" or "replace", to force the delete of old volume in the storage plugin alloc sub.




----- Mail original -----
De: "Wolfgang Bumiller" <w.bumiller at proxmox.com>
À: "pve-devel" <pve-devel at pve.proxmox.com>
Envoyé: Mercredi 19 Août 2015 12:51:14
Objet: [pve-devel] [PATCH v11 cloudinit 9/9] cloudinit 'hotplug'

*) always replace old cloudinit images 
*) apply pending cloudinit changes when generating a new 
image 

For cloudinit we now always use vdisk_free before 
vdisk_alloc in order to always replace old images, this 
allows us to hotplug a new drive by setting it to 
`none,media=cdrom` first (to eject the disk), then setting 
it back to 'storage:cloudinit' to have a new image generated 
after applying the currently pending changes. 
--- 
PVE/API2/Qemu.pm | 5 ++++- 
PVE/QemuServer.pm | 36 ++++++++++++++++++++++++++++++++++-- 
2 files changed, 38 insertions(+), 3 deletions(-) 

diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm 
index 4341506..8762ca2 100644 
--- a/PVE/API2/Qemu.pm 
+++ b/PVE/API2/Qemu.pm 
@@ -131,6 +131,9 @@ my $create_disks = sub { 
} 
# FIXME: Reasonable size? qcow2 shouldn't grow if the space isn't used anyway? 
my $cloudinit_iso_size = 5; # in MB 
+ eval { # delete old images if they exist 
+ PVE::Storage::vdisk_free($storecfg, "$storeid:$vmid/$name"); 
+ }; # ignore errors 
my $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, 
$fmt, $name, $cloudinit_iso_size*1024); 
$disk->{file} = $volid; 
@@ -138,7 +141,6 @@ my $create_disks = sub { 
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; 
@@ -935,6 +937,7 @@ my $update_vm_api = sub { 

if (PVE::QemuServer::valid_drivename($opt)) { 
my $drive = PVE::QemuServer::parse_drive($opt, $param->{$opt}); 
+ # FIXME: cloudinit: CDROM or Disk? 
if (PVE::QemuServer::drive_is_cdrom($drive)) { # CDROM 
$rpcenv->check_vm_perm($authuser, $vmid, undef, ['VM.Config.CDROM']); 
} else { 
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm 
index 5f14a90..a026dd7 100644 
--- a/PVE/QemuServer.pm 
+++ b/PVE/QemuServer.pm 
@@ -387,6 +387,9 @@ EODESCR 
maxLength => 256, 
optional => 1, 
}, 
+}; 
+ 
+my $confdesc_cloudinit = { 
searchdomain => { 
optional => 1, 
type => 'string', 
@@ -503,7 +506,11 @@ PVE::JSONSchema::register_standard_option("pve-qm-ipconfig", $netdesc); 

for (my $i = 0; $i < $MAX_NETS; $i++) { 
$confdesc->{"net$i"} = $netdesc; 
- $confdesc->{"ipconfig$i"} = $ipconfigdesc; 
+ $confdesc_cloudinit->{"ipconfig$i"} = $ipconfigdesc; 
+} 
+ 
+foreach my $key (keys %$confdesc_cloudinit) { 
+ $confdesc->{$key} = $confdesc_cloudinit->{$key}; 
} 

my $drivename_hash; 
@@ -1296,10 +1303,15 @@ sub print_netdev_full { 
return $netdev; 
} 

+sub drive_is_cloudinit { 
+ my ($drive) = @_; 
+ return $drive->{file} =~ m@[:/]vm-\d+-cloudinit(?:\.$QEMU_FORMAT_RE)?$@; 
+} 
+ 
sub drive_is_cdrom { 
my ($drive, $exclude_cloudinit) = @_; 

- return 0 if $exclude_cloudinit && $drive->{file} =~ m@[:/]vm-\d+-cloudinit(?:\.$QEMU_FORMAT_RE)?$@; 
+ return 0 if $exclude_cloudinit && drive_is_cloudinit($drive); 

return $drive && $drive->{media} && ($drive->{media} eq 'cdrom'); 

@@ -4064,6 +4076,22 @@ sub vmconfig_hotplug_pending { 
} 
} 

+ my $apply_pending_cloudinit; 
+ $apply_pending_cloudinit = sub { 
+ my ($key, $value) = @_; 
+ $apply_pending_cloudinit = sub {}; # once is enough 
+ 
+ my @cloudinit_opts = keys %$confdesc_cloudinit; 
+ foreach my $opt (keys %{$conf->{pending}}) { 
+ next if !grep { $_ eq $opt } @cloudinit_opts; 
+ $conf->{$opt} = delete $conf->{pending}->{$opt}; 
+ } 
+ 
+ my $new_conf = { %$conf }; 
+ $new_conf->{$key} = $value; 
+ generate_cloudinitconfig($new_conf, $vmid); 
+ }; 
+ 
foreach my $opt (keys %{$conf->{pending}}) { 
next if $selection && !$selection->{$opt}; 
my $value = $conf->{pending}->{$opt}; 
@@ -4097,6 +4125,10 @@ sub vmconfig_hotplug_pending { 
$vmid, $opt, $value); 
} elsif (valid_drivename($opt)) { 
# some changes can be done without hotplug 
+ my $drive = parse_drive($opt, $value); 
+ if (drive_is_cloudinit($drive)) { 
+ &$apply_pending_cloudinit($opt, $value); 
+ } 
vmconfig_update_disk($storecfg, $conf, $hotplug_features->{disk}, 
$vmid, $opt, $value, 1); 
} elsif ($opt =~ m/^memory$/) { #dimms 
-- 
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