From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.proxmox.com (Postfix) with ESMTPS id 4991765E9B for ; Wed, 9 Mar 2022 11:09:35 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id DE66D1BA1A for ; Wed, 9 Mar 2022 11:09:34 +0100 (CET) Received: from proxmox-new.maurer-it.com (proxmox-new.maurer-it.com [94.136.29.106]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by firstgate.proxmox.com (Proxmox) with ESMTPS id 5F10E1B8D9 for ; Wed, 9 Mar 2022 11:09:28 +0100 (CET) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 3773A463C9 for ; Wed, 9 Mar 2022 11:09:28 +0100 (CET) From: Fabian Ebner To: pve-devel@lists.proxmox.com Date: Wed, 9 Mar 2022 11:09:16 +0100 Message-Id: <20220309100919.31512-15-f.ebner@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220309100919.31512-1-f.ebner@proxmox.com> References: <20220309100919.31512-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.123 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record T_SCC_BODY_TEXT_LINE -0.01 - Subject: [pve-devel] [PATCH v12 qemu-server 14/16] schema: drive: use separate schema when disk allocation is possible X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 09 Mar 2022 10:09:35 -0000 via the special syntax :. Not worth it by itself, but this is anticipating a new 'import-from' parameter which is only used upon import/allocation, but shouldn't be part of the schema for the config or other API enpoints. Signed-off-by: Fabian Ebner --- PVE/API2/Qemu.pm | 12 ++++++-- PVE/QemuServer.pm | 9 ++++-- PVE/QemuServer/Drive.pm | 62 +++++++++++++++++++++++++++++------------ 3 files changed, 60 insertions(+), 23 deletions(-) diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm index 7c3bb91..216c326 100644 --- a/PVE/API2/Qemu.pm +++ b/PVE/API2/Qemu.pm @@ -569,7 +569,9 @@ __PACKAGE__->register_method({ default => 0, description => "Start VM after it was created successfully.", }, - }), + }, + 1, # with_disk_alloc + ), }, returns => { type => 'string', @@ -1552,7 +1554,9 @@ __PACKAGE__->register_method({ maximum => 30, optional => 1, }, - }), + }, + 1, # with_disk_alloc + ), }, returns => { type => 'string', @@ -1600,7 +1604,9 @@ __PACKAGE__->register_method({ maxLength => 40, optional => 1, }, - }), + }, + 1, # with_disk_alloc + ), }, returns => { type => 'null' }, code => sub { diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm index 8c553b1..5b68bdf 100644 --- a/PVE/QemuServer.pm +++ b/PVE/QemuServer.pm @@ -2184,7 +2184,7 @@ sub verify_usb_device { # add JSON properties for create and set function sub json_config_properties { - my $prop = shift; + my ($prop, $with_disk_alloc) = @_; my $skip_json_config_opts = { parent => 1, @@ -2197,7 +2197,12 @@ sub json_config_properties { foreach my $opt (keys %$confdesc) { next if $skip_json_config_opts->{$opt}; - $prop->{$opt} = $confdesc->{$opt}; + + if ($with_disk_alloc && is_valid_drivename($opt)) { + $prop->{$opt} = $PVE::QemuServer::Drive::drivedesc_hash_with_alloc->{$opt}; + } else { + $prop->{$opt} = $confdesc->{$opt}; + } } return $prop; diff --git a/PVE/QemuServer/Drive.pm b/PVE/QemuServer/Drive.pm index 7b82fb2..d5d4723 100644 --- a/PVE/QemuServer/Drive.pm +++ b/PVE/QemuServer/Drive.pm @@ -3,6 +3,8 @@ package PVE::QemuServer::Drive; use strict; use warnings; +use Storable qw(dclone); + use PVE::Storage; use PVE::JSONSchema qw(get_standard_option); @@ -33,6 +35,8 @@ our $MAX_SATA_DISKS = 6; our $MAX_UNUSED_DISKS = 256; our $drivedesc_hash; +# Schema when disk allocation is possible. +our $drivedesc_hash_with_alloc = {}; my %drivedesc_base = ( volume => { alias => 'file' }, @@ -262,14 +266,10 @@ my $ide_fmt = { }; PVE::JSONSchema::register_format("pve-qm-ide", $ide_fmt); -my $ALLOCATION_SYNTAX_DESC = - "Use the special syntax STORAGE_ID:SIZE_IN_GiB to allocate a new volume."; - my $idedesc = { optional => 1, type => 'string', format => $ide_fmt, - description => "Use volume as IDE hard disk or CD-ROM (n is 0 to " .($MAX_IDE_DISKS -1) . "). " . - $ALLOCATION_SYNTAX_DESC, + description => "Use volume as IDE hard disk or CD-ROM (n is 0 to " .($MAX_IDE_DISKS - 1) . ").", }; PVE::JSONSchema::register_standard_option("pve-qm-ide", $idedesc); @@ -285,8 +285,7 @@ my $scsi_fmt = { my $scsidesc = { optional => 1, type => 'string', format => $scsi_fmt, - description => "Use volume as SCSI hard disk or CD-ROM (n is 0 to " . ($MAX_SCSI_DISKS - 1) . "). " . - $ALLOCATION_SYNTAX_DESC, + description => "Use volume as SCSI hard disk or CD-ROM (n is 0 to " . ($MAX_SCSI_DISKS - 1) . ").", }; PVE::JSONSchema::register_standard_option("pve-qm-scsi", $scsidesc); @@ -298,8 +297,7 @@ my $sata_fmt = { my $satadesc = { optional => 1, type => 'string', format => $sata_fmt, - description => "Use volume as SATA hard disk or CD-ROM (n is 0 to " . ($MAX_SATA_DISKS - 1). "). " . - $ALLOCATION_SYNTAX_DESC, + description => "Use volume as SATA hard disk or CD-ROM (n is 0 to " . ($MAX_SATA_DISKS - 1). ").", }; PVE::JSONSchema::register_standard_option("pve-qm-sata", $satadesc); @@ -311,8 +309,7 @@ my $virtio_fmt = { my $virtiodesc = { optional => 1, type => 'string', format => $virtio_fmt, - description => "Use volume as VIRTIO hard disk (n is 0 to " . ($MAX_VIRTIO_DISKS - 1) . "). " . - $ALLOCATION_SYNTAX_DESC, + description => "Use volume as VIRTIO hard disk (n is 0 to " . ($MAX_VIRTIO_DISKS - 1) . ").", }; PVE::JSONSchema::register_standard_option("pve-qm-virtio", $virtiodesc); @@ -359,9 +356,7 @@ my $efidisk_fmt = { my $efidisk_desc = { optional => 1, type => 'string', format => $efidisk_fmt, - description => "Configure a Disk for storing EFI vars. " . - $ALLOCATION_SYNTAX_DESC . " Note that SIZE_IN_GiB is ignored here " . - "and that the default EFI vars are copied to the volume instead.", + description => "Configure a Disk for storing EFI vars.", }; PVE::JSONSchema::register_standard_option("pve-qm-efidisk", $efidisk_desc); @@ -397,10 +392,7 @@ my $tpmstate_fmt = { my $tpmstate_desc = { optional => 1, type => 'string', format => $tpmstate_fmt, - description => "Configure a Disk for storing TPM state. " . - $ALLOCATION_SYNTAX_DESC . " Note that SIZE_IN_GiB is ignored here " . - "and that the default size of 4 MiB will always be used instead. The " . - "format is also fixed to 'raw'.", + description => "Configure a Disk for storing TPM state. The format is fixed to 'raw'.", }; use constant TPMSTATE_DISK_SIZE => 4 * 1024 * 1024; @@ -434,27 +426,61 @@ my $unuseddesc = { description => "Reference to unused volumes. This is used internally, and should not be modified manually.", }; +my $with_alloc_desc_cache = { + unused => $unuseddesc, # Allocation for unused is not supported currently. +}; +my $desc_with_alloc = sub { + my ($type, $desc) = @_; + + return $with_alloc_desc_cache->{$type} if $with_alloc_desc_cache->{$type}; + + my $new_desc = dclone($desc); + + my $extra_note = ''; + if ($type eq 'efidisk') { + $extra_note = " Note that SIZE_IN_GiB is ignored here and that the default EFI vars are ". + "copied to the volume instead."; + } elsif ($type eq 'tpmstate') { + $extra_note = " Note that SIZE_IN_GiB is ignored here and 4 MiB will be used instead."; + } + + $new_desc->{description} .= " Use the special syntax STORAGE_ID:SIZE_IN_GiB to allocate a new ". + "volume.${extra_note}"; + + $with_alloc_desc_cache->{$type} = $new_desc; + + return $new_desc; +}; + for (my $i = 0; $i < $MAX_IDE_DISKS; $i++) { $drivedesc_hash->{"ide$i"} = $idedesc; + $drivedesc_hash_with_alloc->{"ide$i"} = $desc_with_alloc->('ide', $idedesc); } for (my $i = 0; $i < $MAX_SATA_DISKS; $i++) { $drivedesc_hash->{"sata$i"} = $satadesc; + $drivedesc_hash_with_alloc->{"sata$i"} = $desc_with_alloc->('sata', $satadesc); } for (my $i = 0; $i < $MAX_SCSI_DISKS; $i++) { $drivedesc_hash->{"scsi$i"} = $scsidesc; + $drivedesc_hash_with_alloc->{"scsi$i"} = $desc_with_alloc->('scsi', $scsidesc); } for (my $i = 0; $i < $MAX_VIRTIO_DISKS; $i++) { $drivedesc_hash->{"virtio$i"} = $virtiodesc; + $drivedesc_hash_with_alloc->{"virtio$i"} = $desc_with_alloc->('virtio', $virtiodesc); } $drivedesc_hash->{efidisk0} = $efidisk_desc; +$drivedesc_hash_with_alloc->{efidisk0} = $desc_with_alloc->('efidisk', $efidisk_desc); + $drivedesc_hash->{tpmstate0} = $tpmstate_desc; +$drivedesc_hash_with_alloc->{tpmstate0} = $desc_with_alloc->('tpmstate', $tpmstate_desc); for (my $i = 0; $i < $MAX_UNUSED_DISKS; $i++) { $drivedesc_hash->{"unused$i"} = $unuseddesc; + $drivedesc_hash_with_alloc->{"unused$i"} = $desc_with_alloc->('unused', $unuseddesc); } sub valid_drive_names_for_boot { -- 2.30.2