]> git.proxmox.com Git - qemu-server.git/blobdiff - PVE/API2/Qemu.pm
sync bwlimit description with the container one
[qemu-server.git] / PVE / API2 / Qemu.pm
index 0174feb32d7fd99f76fa6d21bcc34d62df04a084..0f27d299fc6b2ecee2575942f6b0b1b689b06930 100644 (file)
@@ -430,6 +430,12 @@ __PACKAGE__->register_method({
                    type => 'string', format => 'pve-poolid',
                    description => "Add the VM to the specified pool.",
                },
+               bwlimit => {
+                   description => "Override i/o bandwidth limit (in KiB/s).",
+                   optional => 1,
+                   type => 'integer',
+                   minimum => '0',
+               }
            }),
     },
     returns => {
@@ -456,6 +462,8 @@ __PACKAGE__->register_method({
 
        my $pool = extract_param($param, 'pool');
 
+       my $bwlimit = extract_param($param, 'bwlimit');
+
        my $filename = PVE::QemuConfig->config_file($vmid);
 
        my $storecfg = PVE::Storage::config();
@@ -543,7 +551,8 @@ __PACKAGE__->register_method({
                PVE::QemuServer::restore_archive($archive, $vmid, $authuser, {
                    storage => $storage,
                    pool => $pool,
-                   unique => $unique });
+                   unique => $unique,
+                   bwlimit => $bwlimit, });
 
                PVE::AccessControl::add_vm_to_pool($vmid, $pool) if $pool;
            };
@@ -807,6 +816,11 @@ __PACKAGE__->register_method({
 
        delete $conf->{pending};
 
+       # hide cloudinit password
+       if ($conf->{cipassword}) {
+           $conf->{cipassword} = '**********';
+       }
+
        return $conf;
     }});
 
@@ -871,6 +885,13 @@ __PACKAGE__->register_method({
            $item->{value} = $conf->{$opt} if defined($conf->{$opt});
            $item->{pending} = $conf->{pending}->{$opt} if defined($conf->{pending}->{$opt});
            $item->{delete} = ($pending_delete_hash->{$opt} ? 2 : 1) if exists $pending_delete_hash->{$opt};
+
+           # hide cloudinit password
+           if ($opt eq 'cipassword') {
+               $item->{value} = '**********' if defined($item->{value});
+               # the trailing space so that the pending string is different
+               $item->{pending} = '********** ' if defined($item->{pending});
+           }
            push @$res, $item;
        }
 
@@ -880,6 +901,11 @@ __PACKAGE__->register_method({
            next if defined($conf->{$opt});
            my $item = { key => $opt };
            $item->{pending} = $conf->{pending}->{$opt};
+
+           # hide cloudinit password
+           if ($opt eq 'cipassword') {
+               $item->{pending} = '**********' if defined($item->{pending});
+           }
            push @$res, $item;
        }
 
@@ -920,10 +946,16 @@ my $update_vm_api  = sub {
 
     my $background_delay = extract_param($param, 'background_delay');
 
+    if (defined(my $cipassword = $param->{cipassword})) {
+       # Same logic as in cloud-init (but with the regex fixed...)
+       $param->{cipassword} = PVE::Tools::encrypt_pw($cipassword)
+           if $cipassword !~ /^\$(?:[156]|2[ay])(\$.+){2}/;
+    }
 
     my @paramarr = (); # used for log message
     foreach my $key (sort keys %$param) {
-       push @paramarr, "-$key", $param->{$key};
+       my $value = $key eq 'cipassword' ? '<hidden>' : $param->{$key};
+       push @paramarr, "-$key", $value;
     }
 
     my $skiplock = extract_param($param, 'skiplock');
@@ -941,12 +973,6 @@ my $update_vm_api  = sub {
        PVE::Tools::validate_ssh_public_keys($ssh_keys);
     }
 
-    if (defined(my $cipassword = $param->{cipassword})) {
-       # Same logic as in cloud-init (but with the regex fixed...)
-       $param->{cipassword} = PVE::Tools::encrypt_pw($cipassword)
-           if $cipassword !~ /^\$(?:[156]|2[ay])(\$.+){2}/;
-    }
-
     die "no options specified\n" if !$delete_str && !$revert_str && !scalar(keys %$param);
 
     my $storecfg = PVE::Storage::config();
@@ -2455,7 +2481,9 @@ __PACKAGE__->register_method({
        properties => {
            node => get_standard_option('pve-node'),
            vmid => get_standard_option('pve-vmid', { completion => \&PVE::QemuServer::complete_vmid }),
-           newid => get_standard_option('pve-vmid', { description => 'VMID for the clone.' }),
+           newid => get_standard_option('pve-vmid', {
+               completion => \&PVE::Cluster::complete_next_vmid,
+               description => 'VMID for the clone.' }),
            name => {
                optional => 1,
                type => 'string', format => 'dns-name',
@@ -2476,12 +2504,10 @@ __PACKAGE__->register_method({
             }),
            storage => get_standard_option('pve-storage-id', {
                description => "Target storage for full clone.",
-               requires => 'full',
                optional => 1,
            }),
            'format' => {
-               description => "Target format for file storage.",
-               requires => 'full',
+               description => "Target format for file storage. Only valid for full clone.",
                type => 'string',
                optional => 1,
                enum => [ 'raw', 'qcow2', 'vmdk'],
@@ -2489,9 +2515,8 @@ __PACKAGE__->register_method({
            full => {
                optional => 1,
                type => 'boolean',
-               description => "Create a full copy of all disk. This is always done when " .
+               description => "Create a full copy of all disks. This is always done when " .
                    "you clone a normal VM. For VM templates, we try to create a linked clone by default.",
-               default => 0,
            },
            target => get_standard_option('pve-node', {
                description => "Target node. Only allowed if the original VM is on shared storage.",
@@ -2572,6 +2597,17 @@ __PACKAGE__->register_method({
            die "snapshot '$snapname' does not exist\n"
                if $snapname && !defined( $conf->{snapshots}->{$snapname});
 
+           my $full = extract_param($param, 'full');
+           if (!defined($full)) {
+               $full = !PVE::QemuConfig->is_template($conf);
+           }
+
+           die "parameter 'storage' not allowed for linked clones\n"
+               if defined($storage) && !$full;
+
+           die "parameter 'format' not allowed for linked clones\n"
+               if defined($format) && !$full;
+
            my $oldconf = $snapname ? $conf->{snapshots}->{$snapname} : $conf;
 
            my $sharedvm = &$check_storage_access_clone($rpcenv, $authuser, $storecfg, $oldconf, $storage);
@@ -2610,7 +2646,7 @@ __PACKAGE__->register_method({
                    if (PVE::QemuServer::drive_is_cdrom($drive, 1)) {
                        $newconf->{$opt} = $value; # simply copy configuration
                    } else {
-                       if ($param->{full} || PVE::QemuServer::drive_is_cloudinit($drive)) {
+                       if ($full || PVE::QemuServer::drive_is_cloudinit($drive)) {
                            die "Full clone feature is not supported for drive '$opt'\n"
                                if !PVE::Storage::volume_has_feature($storecfg, 'copy', $drive->{file}, $snapname, $running);
                            $fullclone->{$opt} = 1;