X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=PVE%2FAPI2%2FQemu.pm;h=e2bd09360ecb35abe0e52c109c7ee1e69e4988ad;hb=f8c4b2c5ba1820b86ae69751ab643e26ca8c9852;hp=8da616a503a792264c3858bc52e2cce843407bf3;hpb=aa491a6ecd444163922c8d741d6a5cb8b428cb4a;p=qemu-server.git diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm index 8da616a..e2bd093 100644 --- a/PVE/API2/Qemu.pm +++ b/PVE/API2/Qemu.pm @@ -656,9 +656,9 @@ __PACKAGE__->register_method({ eval { $vollist = &$create_disks($rpcenv, $authuser, $conf, $arch, $storecfg, $vmid, $pool, $param, $storage); - if (!$conf->{bootdisk}) { - my $firstdisk = PVE::QemuServer::Drive::resolve_first_disk($conf); - $conf->{bootdisk} = $firstdisk if $firstdisk; + if (!$conf->{boot}) { + my $devs = PVE::QemuServer::get_default_bootdevices($conf); + $conf->{boot} = PVE::QemuServer::print_bootorder($devs); } # auto generate uuid if user did not specify smbios1 option @@ -1191,6 +1191,12 @@ my $update_vm_api = sub { my $modified = {}; # record what $option we modify + my $bootcfg = PVE::JSONSchema::parse_property_string('pve-qm-boot', $conf->{boot}) + if $conf->{boot}; + my @bootorder = PVE::Tools::split_list($bootcfg->{order}) + if $bootcfg && $bootcfg->{order}; + my $bootorder_deleted = grep {$_ eq 'bootorder'} @delete; + foreach my $opt (@delete) { $modified->{$opt} = 1; $conf = PVE::QemuConfig->load_config($vmid); # update/reload @@ -1205,6 +1211,13 @@ my $update_vm_api = sub { my $is_pending_val = defined($conf->{pending}->{$opt}); delete $conf->{pending}->{$opt}; + # remove from bootorder if necessary + if (!$bootorder_deleted && @bootorder && grep {$_ eq $opt} @bootorder) { + @bootorder = grep {$_ ne $opt} @bootorder; + $conf->{pending}->{boot} = PVE::QemuServer::print_bootorder(\@bootorder); + $modified->{boot} = 1; + } + if ($opt =~ m/^unused/) { my $drive = PVE::QemuServer::parse_drive($opt, $val); PVE::QemuConfig->check_protection($conf, "can't remove unused disk '$drive->{file}'"); @@ -1283,6 +1296,24 @@ my $update_vm_api = sub { $conf->{pending}->{$opt} = $param->{$opt}; } else { $conf->{pending}->{$opt} = $param->{$opt}; + + if ($opt eq 'boot') { + my $new_bootcfg = PVE::JSONSchema::parse_property_string('pve-qm-boot', $param->{$opt}); + if ($new_bootcfg->{order}) { + my @devs = PVE::Tools::split_list($new_bootcfg->{order}); + for my $dev (@devs) { + my $exists = $conf->{$dev} || $conf->{pending}->{$dev}; + my $deleted = grep {$_ eq $dev} @delete; + die "invalid bootorder: device '$dev' does not exist'\n" + if !$exists || $deleted; + } + + # remove legacy boot order settings if new one set + $conf->{pending}->{$opt} = PVE::QemuServer::print_bootorder(\@devs); + PVE::QemuConfig->add_to_pending_delete($conf, "bootdisk") + if $conf->{bootdisk}; + } + } } PVE::QemuConfig->remove_from_pending_delete($conf, $opt); PVE::QemuConfig->write_config($vmid, $conf); @@ -3000,6 +3031,7 @@ __PACKAGE__->register_method({ if !PVE::Storage::volume_has_feature($storecfg, 'clone', $drive->{file}, $snapname, $running); } $drives->{$opt} = $drive; + next if PVE::QemuServer::drive_is_cloudinit($drive); push @$vollist, $drive->{file}; } } else {