mirror of
https://git.proxmox.com/git/qemu-server
synced 2025-08-12 11:35:06 +00:00
use new config helpers from guest-common for pending changes
most of the pending changes related code has been moved into AbstractConfig, so we have to call them as class methods from QemuConfig instead. Signed-off-by: Oguz Bektas <o.bektas@proxmox.com>
This commit is contained in:
parent
d3179e1c36
commit
98bc3aeb92
@ -931,7 +931,7 @@ __PACKAGE__->register_method({
|
||||
|
||||
my $conf = PVE::QemuConfig->load_config($param->{vmid});
|
||||
|
||||
my $pending_delete_hash = PVE::QemuServer::split_flagged_list($conf->{pending}->{delete});
|
||||
my $pending_delete_hash = PVE::QemuConfig->parse_pending_delete($conf->{pending}->{delete});
|
||||
|
||||
my $res = [];
|
||||
|
||||
@ -1182,7 +1182,7 @@ my $update_vm_api = sub {
|
||||
$rpcenv->check_vm_perm($authuser, $vmid, undef, ['VM.Config.Disk']);
|
||||
PVE::QemuServer::vmconfig_register_unused_drive($storecfg, $vmid, $conf, PVE::QemuServer::parse_drive($opt, $val))
|
||||
if $is_pending_val;
|
||||
PVE::QemuServer::vmconfig_delete_pending_option($conf, $opt, $force);
|
||||
PVE::QemuConfig->add_to_pending_delete($conf, $opt, $force);
|
||||
PVE::QemuConfig->write_config($vmid, $conf);
|
||||
} elsif ($opt =~ m/^serial\d+$/) {
|
||||
if ($val eq 'socket') {
|
||||
@ -1190,7 +1190,7 @@ my $update_vm_api = sub {
|
||||
} elsif ($authuser ne 'root@pam') {
|
||||
die "only root can delete '$opt' config for real devices\n";
|
||||
}
|
||||
PVE::QemuServer::vmconfig_delete_pending_option($conf, $opt, $force);
|
||||
PVE::QemuConfig->add_to_pending_delete($conf, $opt, $force);
|
||||
PVE::QemuConfig->write_config($vmid, $conf);
|
||||
} elsif ($opt =~ m/^usb\d+$/) {
|
||||
if ($val =~ m/spice/) {
|
||||
@ -1198,10 +1198,10 @@ my $update_vm_api = sub {
|
||||
} elsif ($authuser ne 'root@pam') {
|
||||
die "only root can delete '$opt' config for real devices\n";
|
||||
}
|
||||
PVE::QemuServer::vmconfig_delete_pending_option($conf, $opt, $force);
|
||||
PVE::QemuConfig->add_to_pending_delete($conf, $opt, $force);
|
||||
PVE::QemuConfig->write_config($vmid, $conf);
|
||||
} else {
|
||||
PVE::QemuServer::vmconfig_delete_pending_option($conf, $opt, $force);
|
||||
PVE::QemuConfig->add_to_pending_delete($conf, $opt, $force);
|
||||
PVE::QemuConfig->write_config($vmid, $conf);
|
||||
}
|
||||
}
|
||||
@ -1242,13 +1242,13 @@ my $update_vm_api = sub {
|
||||
} else {
|
||||
$conf->{pending}->{$opt} = $param->{$opt};
|
||||
}
|
||||
PVE::QemuServer::vmconfig_undelete_pending_option($conf, $opt);
|
||||
PVE::QemuConfig->remove_from_pending_delete($conf, $opt);
|
||||
PVE::QemuConfig->write_config($vmid, $conf);
|
||||
}
|
||||
|
||||
# remove pending changes when nothing changed
|
||||
$conf = PVE::QemuConfig->load_config($vmid); # update/reload
|
||||
my $changes = PVE::QemuServer::vmconfig_cleanup_pending($conf);
|
||||
my $changes = PVE::QemuConfig->cleanup_pending($conf);
|
||||
PVE::QemuConfig->write_config($vmid, $conf) if $changes;
|
||||
|
||||
return if !scalar(keys %{$conf->{pending}});
|
||||
|
@ -2350,40 +2350,6 @@ sub vm_is_volid_owner {
|
||||
return undef;
|
||||
}
|
||||
|
||||
sub split_flagged_list {
|
||||
my $text = shift || '';
|
||||
$text =~ s/[,;]/ /g;
|
||||
$text =~ s/^\s+//;
|
||||
return { map { /^(!?)(.*)$/ && ($2, $1) } ($text =~ /\S+/g) };
|
||||
}
|
||||
|
||||
sub join_flagged_list {
|
||||
my ($how, $lst) = @_;
|
||||
join $how, map { $lst->{$_} . $_ } keys %$lst;
|
||||
}
|
||||
|
||||
sub vmconfig_delete_pending_option {
|
||||
my ($conf, $key, $force) = @_;
|
||||
|
||||
delete $conf->{pending}->{$key};
|
||||
my $pending_delete_hash = split_flagged_list($conf->{pending}->{delete});
|
||||
$pending_delete_hash->{$key} = $force ? '!' : '';
|
||||
$conf->{pending}->{delete} = join_flagged_list(',', $pending_delete_hash);
|
||||
}
|
||||
|
||||
sub vmconfig_undelete_pending_option {
|
||||
my ($conf, $key) = @_;
|
||||
|
||||
my $pending_delete_hash = split_flagged_list($conf->{pending}->{delete});
|
||||
delete $pending_delete_hash->{$key};
|
||||
|
||||
if (%$pending_delete_hash) {
|
||||
$conf->{pending}->{delete} = join_flagged_list(',', $pending_delete_hash);
|
||||
} else {
|
||||
delete $conf->{pending}->{delete};
|
||||
}
|
||||
}
|
||||
|
||||
sub vmconfig_register_unused_drive {
|
||||
my ($storecfg, $vmid, $conf, $drive) = @_;
|
||||
|
||||
@ -2398,37 +2364,6 @@ sub vmconfig_register_unused_drive {
|
||||
}
|
||||
}
|
||||
|
||||
sub vmconfig_cleanup_pending {
|
||||
my ($conf) = @_;
|
||||
|
||||
# remove pending changes when nothing changed
|
||||
my $changes;
|
||||
foreach my $opt (keys %{$conf->{pending}}) {
|
||||
if (defined($conf->{$opt}) && ($conf->{pending}->{$opt} eq $conf->{$opt})) {
|
||||
$changes = 1;
|
||||
delete $conf->{pending}->{$opt};
|
||||
}
|
||||
}
|
||||
|
||||
my $current_delete_hash = split_flagged_list($conf->{pending}->{delete});
|
||||
my $pending_delete_hash = {};
|
||||
while (my ($opt, $force) = each %$current_delete_hash) {
|
||||
if (defined($conf->{$opt})) {
|
||||
$pending_delete_hash->{$opt} = $force;
|
||||
} else {
|
||||
$changes = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (%$pending_delete_hash) {
|
||||
$conf->{pending}->{delete} = join_flagged_list(',', $pending_delete_hash);
|
||||
} else {
|
||||
delete $conf->{pending}->{delete};
|
||||
}
|
||||
|
||||
return $changes;
|
||||
}
|
||||
|
||||
# smbios: [manufacturer=str][,product=str][,version=str][,serial=str][,uuid=uuid][,sku=str][,family=str][,base64=bool]
|
||||
my $smbios1_fmt = {
|
||||
uuid => {
|
||||
@ -4920,7 +4855,7 @@ sub vmconfig_hotplug_pending {
|
||||
|
||||
my $hotplug_features = parse_hotplug_features(defined($conf->{hotplug}) ? $conf->{hotplug} : '1');
|
||||
|
||||
my $pending_delete_hash = split_flagged_list($conf->{pending}->{delete});
|
||||
my $pending_delete_hash = PVE::QemuConfig->parse_pending_delete($conf->{pending}->{delete});
|
||||
while (my ($opt, $force) = each %$pending_delete_hash) {
|
||||
next if $selection && !$selection->{$opt};
|
||||
eval {
|
||||
@ -4976,7 +4911,7 @@ sub vmconfig_hotplug_pending {
|
||||
} else {
|
||||
# save new config if hotplug was successful
|
||||
delete $conf->{$opt};
|
||||
vmconfig_undelete_pending_option($conf, $opt);
|
||||
PVE::QemuConfig->remove_from_pending_delete($conf, $opt);
|
||||
PVE::QemuConfig->write_config($vmid, $conf);
|
||||
$conf = PVE::QemuConfig->load_config($vmid); # update/reload
|
||||
}
|
||||
@ -5111,25 +5046,27 @@ sub vmconfig_delete_or_detach_drive {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
sub vmconfig_apply_pending {
|
||||
my ($vmid, $conf, $storecfg) = @_;
|
||||
|
||||
# cold plug
|
||||
|
||||
my $pending_delete_hash = split_flagged_list($conf->{pending}->{delete});
|
||||
my $pending_delete_hash = PVE::QemuConfig->parse_pending_delete($conf->{pending}->{delete});
|
||||
while (my ($opt, $force) = each %$pending_delete_hash) {
|
||||
die "internal error" if $opt =~ m/^unused/;
|
||||
$conf = PVE::QemuConfig->load_config($vmid); # update/reload
|
||||
if (!defined($conf->{$opt})) {
|
||||
vmconfig_undelete_pending_option($conf, $opt);
|
||||
PVE::QemuConfig->remove_from_pending_delete($conf, $opt);
|
||||
PVE::QemuConfig->write_config($vmid, $conf);
|
||||
} elsif (is_valid_drivename($opt)) {
|
||||
vmconfig_delete_or_detach_drive($vmid, $storecfg, $conf, $opt, $force);
|
||||
vmconfig_undelete_pending_option($conf, $opt);
|
||||
PVE::QemuConfig->remove_from_pending_delete($conf, $opt);
|
||||
delete $conf->{$opt};
|
||||
PVE::QemuConfig->write_config($vmid, $conf);
|
||||
} else {
|
||||
vmconfig_undelete_pending_option($conf, $opt);
|
||||
PVE::QemuConfig->remove_from_pending_delete($conf, $opt);
|
||||
delete $conf->{$opt};
|
||||
PVE::QemuConfig->write_config($vmid, $conf);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user