]> git.proxmox.com Git - qemu-server.git/blobdiff - PVE/API2/Qemu.pm
bump version to 7.0-17
[qemu-server.git] / PVE / API2 / Qemu.pm
index 1e540f5821477a08d72ac536fd9c64cc9053dea6..8c5abc139f7291456107c40a00bf21fd8a767aac 100644 (file)
@@ -183,7 +183,12 @@ my $create_disks = sub {
 
            my $volid;
            if ($ds eq 'efidisk0') {
-               ($volid, $size) = PVE::QemuServer::create_efidisk($storecfg, $storeid, $vmid, $fmt, $arch);
+               ($volid, $size) = PVE::QemuServer::create_efidisk(
+                   $storecfg, $storeid, $vmid, $fmt, $arch, $disk);
+           } elsif ($ds eq 'tpmstate0') {
+               # swtpm can only use raw volumes, and uses a fixed size
+               $size = PVE::Tools::convert_size(PVE::QemuServer::Drive::TPMSTATE_DISK_SIZE, 'b' => 'kb');
+               $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, "raw", undef, $size);
            } else {
                $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, $fmt, undef, $size);
            }
@@ -424,7 +429,7 @@ __PACKAGE__->register_method({
     proxyto => 'node',
     protected => 1, # qemu pid files are only readable by root
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            full => {
@@ -497,7 +502,7 @@ __PACKAGE__->register_method({
     protected => 1,
     proxyto => 'node',
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => PVE::QemuServer::json_config_properties(
            {
                node => get_standard_option('pve-node'),
@@ -631,8 +636,7 @@ __PACKAGE__->register_method({
            raise_param_exc({ archive => "option conflicts with other options ($keystr)"}) if $keystr;
 
            if ($archive eq '-') {
-               die "pipe requires cli environment\n"
-                   if $rpcenv->{type} ne 'cli';
+               die "pipe requires cli environment\n" if $rpcenv->{type} ne 'cli';
                $archive = { type => 'pipe' };
            } else {
                PVE::Storage::check_volume_access($rpcenv, $authuser, $storecfg, $vmid, $archive);
@@ -799,7 +803,7 @@ __PACKAGE__->register_method({
        user => 'all',
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid'),
@@ -861,7 +865,7 @@ __PACKAGE__->register_method({
     },
     description => "Read VM RRD statistics (returns PNG)",
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid'),
@@ -907,7 +911,7 @@ __PACKAGE__->register_method({
     },
     description => "Read VM RRD statistics",
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid'),
@@ -950,7 +954,7 @@ __PACKAGE__->register_method({
        check => ['perm', '/vms/{vmid}', [ 'VM.Audit' ]],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid', { completion => \&PVE::QemuServer::complete_vmid }),
@@ -1357,6 +1361,17 @@ my $update_vm_api  = sub {
                        if defined($conf->{pending}->{$opt});
 
                    &$create_disks($rpcenv, $authuser, $conf->{pending}, $arch, $storecfg, $vmid, undef, {$opt => $param->{$opt}});
+
+                   # default legacy boot order implies all cdroms anyway
+                   if (@bootorder) {
+                       # append new CD drives to bootorder to mark them bootable
+                       my $drive = PVE::QemuServer::parse_drive($opt, $param->{$opt});
+                       if (PVE::QemuServer::drive_is_cdrom($drive, 1) && !grep(/^$opt$/, @bootorder)) {
+                           push @bootorder, $opt;
+                           $conf->{pending}->{boot} = PVE::QemuServer::print_bootorder(\@bootorder);
+                           $modified->{boot} = 1;
+                       }
+                   }
                } elsif ($opt =~ m/^serial\d+/) {
                    if ((!defined($conf->{$opt}) || $conf->{$opt} eq 'socket') && $param->{$opt} eq 'socket') {
                        $rpcenv->check_vm_perm($authuser, $vmid, undef, ['VM.Config.HWType']);
@@ -1413,7 +1428,7 @@ my $update_vm_api  = sub {
            if ($running) {
                PVE::QemuServer::vmconfig_hotplug_pending($vmid, $conf, $storecfg, $modified, $errors);
            } else {
-               PVE::QemuServer::vmconfig_apply_pending($vmid, $conf, $storecfg, $running, $errors);
+               PVE::QemuServer::vmconfig_apply_pending($vmid, $conf, $storecfg, $errors);
            }
            raise_param_exc($errors) if scalar(keys %$errors);
 
@@ -1478,7 +1493,7 @@ __PACKAGE__->register_method({
        check => ['perm', '/vms/{vmid}', $vm_config_perm_list, any => 1],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => PVE::QemuServer::json_config_properties(
            {
                node => get_standard_option('pve-node'),
@@ -1533,7 +1548,7 @@ __PACKAGE__->register_method({
        check => ['perm', '/vms/{vmid}', $vm_config_perm_list, any => 1],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => PVE::QemuServer::json_config_properties(
            {
                node => get_standard_option('pve-node'),
@@ -1583,7 +1598,7 @@ __PACKAGE__->register_method({
        check => [ 'perm', '/vms/{vmid}', ['VM.Allocate']],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid', { completion => \&PVE::QemuServer::complete_vmid_stopped }),
@@ -1690,7 +1705,7 @@ __PACKAGE__->register_method({
        check => [ 'perm', '/vms/{vmid}', ['VM.Config.Disk']],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid', { completion => \&PVE::QemuServer::complete_vmid }),
@@ -1745,7 +1760,7 @@ __PACKAGE__->register_method({
     },
     description => "Creates a TCP VNC proxy connections.",
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid'),
@@ -1763,7 +1778,7 @@ __PACKAGE__->register_method({
        },
     },
     returns => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            user => { type => 'string' },
            ticket => { type => 'string' },
@@ -2003,7 +2018,7 @@ __PACKAGE__->register_method({
     },
     description => "Opens a weksocket for VNC traffic.",
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid'),
@@ -2062,7 +2077,7 @@ __PACKAGE__->register_method({
     },
     description => "Returns a SPICE configuration to connect to the VM.",
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid'),
@@ -2106,7 +2121,7 @@ __PACKAGE__->register_method({
        user => 'all',
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid'),
@@ -2152,7 +2167,7 @@ __PACKAGE__->register_method({
        check => ['perm', '/vms/{vmid}', [ 'VM.Audit' ]],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid'),
@@ -2206,7 +2221,7 @@ __PACKAGE__->register_method({
        check => ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid',
@@ -2365,7 +2380,7 @@ __PACKAGE__->register_method({
        check => ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid',
@@ -2453,7 +2468,7 @@ __PACKAGE__->register_method({
        check => ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid',
@@ -2504,7 +2519,7 @@ __PACKAGE__->register_method({
        check => ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid',
@@ -2665,7 +2680,7 @@ __PACKAGE__->register_method({
        check => ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid',
@@ -2749,7 +2764,7 @@ __PACKAGE__->register_method({
        check => ['perm', '/vms/{vmid}', [ 'VM.PowerMgmt' ]],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid',
@@ -2821,7 +2836,7 @@ __PACKAGE__->register_method({
        check => ['perm', '/vms/{vmid}', [ 'VM.Console' ]],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid',
@@ -2865,7 +2880,7 @@ __PACKAGE__->register_method({
        check => ['perm', '/vms/{vmid}', [ 'VM.Audit' ]],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid'),
@@ -2941,7 +2956,7 @@ __PACKAGE__->register_method({
        ]
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid', { completion => \&PVE::QemuServer::complete_vmid }),
@@ -3272,7 +3287,7 @@ __PACKAGE__->register_method({
            ],
     },
     parameters => {
-        additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid', { completion => \&PVE::QemuServer::complete_vmid }),
@@ -3587,7 +3602,7 @@ __PACKAGE__->register_method({
        check => ['perm', '/vms/{vmid}', [ 'VM.Migrate' ]],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid', { completion => \&PVE::QemuServer::complete_vmid }),
@@ -3763,7 +3778,7 @@ __PACKAGE__->register_method({
         check => ['perm', '/vms/{vmid}', [ 'VM.Monitor' ]],
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid'),
@@ -3813,8 +3828,8 @@ __PACKAGE__->register_method({
         check => ['perm', '/vms/{vmid}', [ 'VM.Config.Disk' ]],
     },
     parameters => {
-        additionalProperties => 0,
-        properties => {
+       additionalProperties => 0,
+       properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid', { completion => \&PVE::QemuServer::complete_vmid }),
            skiplock => get_standard_option('skiplock'),
@@ -3938,7 +3953,7 @@ __PACKAGE__->register_method({
     proxyto => 'node',
     protected => 1, # qemu pid files are only readable by root
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            vmid => get_standard_option('pve-vmid', { completion => \&PVE::QemuServer::complete_vmid }),
            node => get_standard_option('pve-node'),
@@ -4083,7 +4098,7 @@ __PACKAGE__->register_method({
        user => 'all',
     },
     parameters => {
-       additionalProperties => 0,
+       additionalProperties => 0,
        properties => {
            vmid => get_standard_option('pve-vmid'),
            node => get_standard_option('pve-node'),
@@ -4325,7 +4340,10 @@ __PACKAGE__->register_method({
 
        },
     },
-    returns => { type => 'null'},
+    returns => {
+       type => 'string',
+       description => "the task ID.",
+    },
     code => sub {
        my ($param) = @_;
 
@@ -4339,8 +4357,7 @@ __PACKAGE__->register_method({
 
        my $disk = extract_param($param, 'disk');
 
-       my $updatefn =  sub {
-
+       my $load_and_check = sub {
            my $conf = PVE::QemuConfig->load_config($vmid);
 
            PVE::QemuConfig->check_lock($conf);
@@ -4354,18 +4371,23 @@ __PACKAGE__->register_method({
            die "you can't convert a VM to template if VM is running\n"
                if PVE::QemuServer::check_running($vmid);
 
-           my $realcmd = sub {
-               PVE::QemuServer::template_create($vmid, $conf, $disk);
-           };
+           return $conf;
+       };
 
-           $conf->{template} = 1;
-           PVE::QemuConfig->write_config($vmid, $conf);
+       $load_and_check->();
+
+       my $realcmd = sub {
+           PVE::QemuConfig->lock_config($vmid, sub {
+               my $conf = $load_and_check->();
+
+               $conf->{template} = 1;
+               PVE::QemuConfig->write_config($vmid, $conf);
 
-           return $rpcenv->fork_worker('qmtemplate', $vmid, $authuser, $realcmd);
+               PVE::QemuServer::template_create($vmid, $conf, $disk);
+           });
        };
 
-       PVE::QemuConfig->lock_config($vmid, $updatefn);
-       return;
+       return $rpcenv->fork_worker('qmtemplate', $vmid, $authuser, $realcmd);
     }});
 
 __PACKAGE__->register_method({