From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 6247E1FF16B for ; Tue, 1 Jul 2025 17:42:43 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id BFB869DBD; Tue, 1 Jul 2025 17:41:43 +0200 (CEST) From: Fiona Ebner To: pve-devel@lists.proxmox.com Date: Tue, 1 Jul 2025 17:40:46 +0200 Message-ID: <20250701154117.434512-27-f.ebner@proxmox.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250701154117.434512-1-f.ebner@proxmox.com> References: <20250701154117.434512-1-f.ebner@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL -0.029 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy 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 Subject: [pve-devel] [PATCH qemu-server v2 26/49] blockdev: introduce and use get_block_info() helper 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: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" When querying the block info, with -blockdev, it is necessary to look at the 'qdev' property of the QMP result, because the 'device' property is not initialized. See also commit 9af3ef69 ("vm devices list: prepare querying block device names for -blockdev"). Signed-off-by: Fiona Ebner --- Changes in v2: * more compact POD. src/PVE/QemuServer.pm | 5 ++--- src/PVE/QemuServer/Blockdev.pm | 37 ++++++++++++++++++++++++++++++++ src/PVE/VZDump/QemuServer.pm | 5 ++--- src/test/MigrationTest/QmMock.pm | 35 ++++++++++++++++++------------ 4 files changed, 62 insertions(+), 20 deletions(-) diff --git a/src/PVE/QemuServer.pm b/src/PVE/QemuServer.pm index a15b4557..dedb05f1 100644 --- a/src/PVE/QemuServer.pm +++ b/src/PVE/QemuServer.pm @@ -5732,14 +5732,13 @@ sub vm_start_nolock { $migrate_storage_uri = "nbd:${localip}:${storage_migrate_port}"; } - my $block_info = mon_cmd($vmid, "query-block"); - $block_info = { map { $_->{device} => $_ } $block_info->@* }; + my $block_info = PVE::QemuServer::Blockdev::get_block_info($vmid); foreach my $opt (sort keys %$nbd) { my $drivestr = $nbd->{$opt}->{drivestr}; my $volid = $nbd->{$opt}->{volid}; - my $block_node = $block_info->{"drive-$opt"}->{inserted}->{'node-name'}; + my $block_node = $block_info->{$opt}->{inserted}->{'node-name'}; mon_cmd( $vmid, diff --git a/src/PVE/QemuServer/Blockdev.pm b/src/PVE/QemuServer/Blockdev.pm index 454a6b7d..362355a0 100644 --- a/src/PVE/QemuServer/Blockdev.pm +++ b/src/PVE/QemuServer/Blockdev.pm @@ -58,6 +58,43 @@ sub qdev_id_to_drive_id { return $qdev_id; # for SCSI/SATA/IDE it's the same } +=pod + +=head3 get_block_info + + my $block_info = get_block_info($vmid); + my $inserted = $block_info->{$drive_key}->{inserted}; + my $node_name = $inserted->{'node-name'}; + my $block_node_size = $inserted->{image}->{'virtual-size'}; + +Returns a hash reference with the information from the C QMP command indexed by +configuration drive keys like C. See the QMP documentation for details. + +Parameters: + +=over + +=item C<$vmid>: The ID of the virtual machine to query. + +=back + +=cut + +sub get_block_info { + my ($vmid) = @_; + + my $block_info = {}; + + my $qmp_block_info = mon_cmd($vmid, "query-block"); + for my $info ($qmp_block_info->@*) { + my $qdev_id = $info->{qdev} or next; + my $drive_id = qdev_id_to_drive_id($qdev_id); + $block_info->{$drive_id} = $info; + } + + return $block_info; +} + my sub get_node_name { my ($type, $drive_id, $volid, $options) = @_; diff --git a/src/PVE/VZDump/QemuServer.pm b/src/PVE/VZDump/QemuServer.pm index f3e292e7..44d3c594 100644 --- a/src/PVE/VZDump/QemuServer.pm +++ b/src/PVE/VZDump/QemuServer.pm @@ -1122,14 +1122,13 @@ sub qga_fs_thaw { sub query_block_node_sizes { my ($self, $vmid, $disks) = @_; - my $block_info = mon_cmd($vmid, "query-block"); - $block_info = { map { $_->{device} => $_ } $block_info->@* }; + my $block_info = PVE::QemuServer::Blockdev::get_block_info($vmid); for my $diskinfo ($disks->@*) { my $drive_key = $diskinfo->{virtdev}; $drive_key .= "-backup" if $drive_key eq 'tpmstate0'; my $block_node_size = - eval { $block_info->{"drive-$drive_key"}->{inserted}->{image}->{'virtual-size'}; }; + eval { $block_info->{$drive_key}->{inserted}->{image}->{'virtual-size'}; }; if (!$block_node_size) { $self->loginfo( "could not determine block node size of drive '$drive_key' - using fallback"); diff --git a/src/test/MigrationTest/QmMock.pm b/src/test/MigrationTest/QmMock.pm index de7f4cd7..78be47d3 100644 --- a/src/test/MigrationTest/QmMock.pm +++ b/src/test/MigrationTest/QmMock.pm @@ -43,6 +43,21 @@ sub fork_worker { # mocked modules +my sub mocked_mon_cmd { + my ($vmid, $command, %params) = @_; + + if ($command eq 'nbd-server-start') { + return; + } elsif ($command eq 'block-export-add') { + return; + } elsif ($command eq 'query-block') { + return []; + } elsif ($command eq 'qom-set') { + return; + } + die "mon_cmd (mocked) - implement me: $command"; +} + my $inotify_module = Test::MockModule->new("PVE::INotify"); $inotify_module->mock( nodename => sub { @@ -50,6 +65,11 @@ $inotify_module->mock( }, ); +my $qemu_server_blockdev_module = Test::MockModule->new("PVE::QemuServer::Blockdev"); +$qemu_server_blockdev_module->mock( + mon_cmd => \&mocked_mon_cmd, +); + my $qemu_server_helpers_module = Test::MockModule->new("PVE::QemuServer::Helpers"); $qemu_server_helpers_module->mock( vm_running_locally => sub { @@ -101,20 +121,7 @@ $MigrationTest::Shared::qemu_server_module->mock( config_to_command => sub { return ['mocked_kvm_command']; }, - mon_cmd => sub { - my ($vmid, $command, %params) = @_; - - if ($command eq 'nbd-server-start') { - return; - } elsif ($command eq 'block-export-add') { - return; - } elsif ($command eq 'query-block') { - return []; - } elsif ($command eq 'qom-set') { - return; - } - die "mon_cmd (mocked) - implement me: $command"; - }, + mon_cmd => \&mocked_mon_cmd, nodename => sub { return $nodename; }, -- 2.47.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel