X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=PVE%2FAPI2%2FQemu.pm;h=8434018992a7c4fa563c9e7db9969faebaa053e1;hb=a1d8c038c58137050c29b697d6d80de902a59892;hp=da5f5b15f8933eaf64d98ad7bcea76b6fa6db177;hpb=17677004cc9a971027c1d7a5c4e07539be6dc27e;p=qemu-server.git diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm index da5f5b1..8434018 100644 --- a/PVE/API2/Qemu.pm +++ b/PVE/API2/Qemu.pm @@ -52,6 +52,7 @@ my $resolve_cdrom_alias = sub { } }; +my $NEW_DISK_RE = qr!^(([^/:\s]+):)?(\d+(\.\d+)?)$!; my $check_storage_access = sub { my ($rpcenv, $authuser, $storecfg, $vmid, $settings, $default_storage) = @_; @@ -66,10 +67,13 @@ my $check_storage_access = sub { # nothing to check } elsif ($isCDROM && ($volid eq 'cdrom')) { $rpcenv->check($authuser, "/", ['Sys.Console']); - } elsif (!$isCDROM && ($volid =~ m/^(([^:\s]+):)?(\d+(\.\d+)?)$/)) { + } elsif (!$isCDROM && ($volid =~ $NEW_DISK_RE)) { my ($storeid, $size) = ($2 || $default_storage, $3); die "no storage ID specified (and no default storage)\n" if !$storeid; $rpcenv->check($authuser, "/storage/$storeid", ['Datastore.AllocateSpace']); + my $scfg = PVE::Storage::storage_config($storecfg, $storeid); + raise_param_exc({ storage => "storage '$storeid' does not support vm images"}) + if !$scfg->{content}->{images}; } else { PVE::Storage::check_volume_access($rpcenv, $authuser, $storecfg, $vmid, $volid); } @@ -115,7 +119,6 @@ my $check_storage_access_clone = sub { # Note: $pool is only needed when creating a VM, because pool permissions # are automatically inherited if VM already exists inside a pool. -my $NEW_DISK_RE = qr!^(([^/:\s]+):)?(\d+(\.\d+)?)$!; my $create_disks = sub { my ($rpcenv, $authuser, $conf, $storecfg, $vmid, $pool, $settings, $default_storage) = @_; @@ -137,15 +140,15 @@ my $create_disks = sub { my $defformat = PVE::Storage::storage_default_format($storecfg, $storeid); my $fmt = $disk->{format} || $defformat; + $size = PVE::Tools::convert_size($size, 'gb' => 'kb'); # vdisk_alloc uses kb + my $volid; if ($ds eq 'efidisk0') { # handle efidisk my $ovmfvars = '/usr/share/kvm/OVMF_VARS-pure-efi.fd'; die "uefi vars image not found\n" if ! -f $ovmfvars; - $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, - $fmt, undef, 128); - $disk->{file} = $volid; - $disk->{size} = 128*1024; + $size = PVE::Tools::convert_size(-s $ovmfvars, 'b' => 'kb'); + $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, $fmt, undef, $size); my ($storeid, $volname) = PVE::Storage::parse_volume_id($volid); my $scfg = PVE::Storage::storage_config($storecfg, $storeid); my $qemufmt = PVE::QemuServer::qemu_img_format($scfg, $volname); @@ -160,12 +163,11 @@ my $create_disks = sub { my $err = $@; die "Copying of EFI Vars image failed: $err" if $err; } else { - $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, - $fmt, undef, $size*1024*1024); - $disk->{file} = $volid; - $disk->{size} = $size*1024*1024*1024; + $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, $fmt, undef, $size); } push @$vollist, $volid; + $disk->{file} = $volid; + $disk->{size} = PVE::Tools::convert_size($size, 'kb' => 'b'); delete $disk->{format}; # no longer needed $res->{$ds} = PVE::QemuServer::print_drive($vmid, $disk); } else { @@ -526,6 +528,9 @@ __PACKAGE__->register_method({ PVE::AccessControl::add_vm_to_pool($vmid, $pool) if $pool; }; + # ensure no old replication state are exists + PVE::ReplicationState::delete_guest_states($vmid); + return $rpcenv->fork_worker('qmrestore', $vmid, $authuser, $realcmd); }; @@ -534,6 +539,9 @@ __PACKAGE__->register_method({ # test after locking PVE::Cluster::check_vmid_unused($vmid); + # ensure no old replication state are exists + PVE::ReplicationState::delete_guest_states($vmid); + my $realcmd = sub { my $vollist = []; @@ -899,7 +907,7 @@ my $update_vm_api = sub { my $background_delay = extract_param($param, 'background_delay'); my @paramarr = (); # used for log message - foreach my $key (keys %$param) { + foreach my $key (sort keys %$param) { push @paramarr, "-$key", $param->{$key}; } @@ -972,6 +980,8 @@ my $update_vm_api = sub { $format = (PVE::Storage::parse_volname($storecfg, $volid))[6]; } return if PVE::Storage::storage_can_replicate($storecfg, $storeid, $format); + my $scfg = PVE::Storage::storage_config($storecfg, $storeid); + return if $scfg->{shared}; die "cannot add non-replicatable volume to a replicated VM\n"; }; @@ -2521,7 +2531,10 @@ __PACKAGE__->register_method({ my $jobs = {}; eval { - local $SIG{INT} = $SIG{TERM} = $SIG{QUIT} = $SIG{HUP} = sub { die "interrupted by signal\n"; }; + local $SIG{INT} = + local $SIG{TERM} = + local $SIG{QUIT} = + local $SIG{HUP} = sub { die "interrupted by signal\n"; }; PVE::Storage::activate_volumes($storecfg, $vollist, $snapname);