public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Daniel Herzig <d.herzig@proxmox.com>
To: Daniel Kral <d.kral@proxmox.com>
Cc: Proxmox VE development discussion <pve-devel@lists.proxmox.com>
Subject: Re: [pve-devel] [PATCH v2 3/12] fix #4225: qemuserver: add function to eject isofiles
Date: Fri, 17 Jan 2025 13:32:16 +0100	[thread overview]
Message-ID: <877c6tmxin.fsf@proxmox.com> (raw)
In-Reply-To: <885b15ca-27f4-4a39-b7a3-4e0ddb3844d9@proxmox.com> (Daniel Kral's message of "Thu, 16 Jan 2025 16:19:03 +0100")

Daniel Kral <d.kral@proxmox.com> writes:

> On 1/13/25 09:55, Daniel Herzig wrote:
>> Current behaviour prevents a VM from starting, if an ISO file defined
>> in the configuration becomes unavailable.
>> The function eject_nonrequired_isos checks on whether a cdrom drive
>> is
>> marked as 'required' or not. If the parameter 'required' is not
>> defined, it will assume 'required' to be true and keep the current
>> behaviour.
>> If 'required' is set to 0, the function 'ejects' the ISO file by
>> setting the drive's file value to 'none', if the underlying storage is
>> unavailable or if the defined file is unavailable for another reason.
>> The function is called while config_to_command iterates over all
>> volumes to allow for early storage activation and early exit in the
>> case of missing required files.
>> Signed-off-by: Daniel Herzig <d.herzig@proxmox.com>
>> ---
>>   PVE/QemuServer.pm | 39 +++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 39 insertions(+)
>> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
>> index d07c170e..f72878d3 100644
>> --- a/PVE/QemuServer.pm
>> +++ b/PVE/QemuServer.pm
>> @@ -4041,6 +4041,8 @@ sub config_to_command {
>>       PVE::QemuConfig->foreach_volume($conf, sub {
>>   	my ($ds, $drive) = @_;
>>   +	eject_nonrequired_isos($ds, $drive, $vmid, $storecfg, $conf);
>> +
>
> This change will unfortunately make two config2cmd test cases fail and
> therefore the build process will also fail. It is important that the
> package can be built at each individual commit so to make the package
> bisectable.
>
> IMO this patch could be split into "introduce eject_norequired_isos"
> and patches #4-#9 could be squashed and put together with adding
> "eject_nonrequired_isos" to config_to_command in the same
> patch. Therefore someone reviewing (now or in the future) and know
> what tests needed to be added/changed when adding this function call
> to config_to_command.
>

Thanks for pointing that out. Batch-applying the patches on my
test-system I completely missed this.

I'll work out something along your lines for v3.


>>   	if (PVE::Storage::parse_volume_id($drive->{file}, 1)) {
>>   	    check_volume_storage_type($storecfg, $drive->{file});
>>   	    push @$vollist, $drive->{file};
>> @@ -8999,6 +9001,43 @@ sub delete_ifaces_ipams_ips {
>>       }
>>   }
>>   +sub eject_nonrequired_isos {
>> +    my ($ds, $drive, $vmid, $storecfg, $conf) = @_;
>> +    # set 1 to exclude cloudinit. cloudinit isos are always required.
>> +    if (drive_is_cdrom($drive, 1)
>> +	&& $drive->{file} ne 'none'
>> +	&& $drive->{file} ne 'cdrom') {
>
> nit: IMO, this could be an early return:
>
> return if !drive_is_cdrom($drive, 1);
> return if $drive->{file} eq 'none' || $drive->{file} eq 'cdrom';
>
> So that we can reduce the following to only 2 indentation levels.
>

I like this idea.

>> +	$drive->{required} = 1 if !defined($drive->{required});
>> +	my $iso_volid = $drive->{file};
>> +	my $iso_path = get_iso_path($storecfg, $vmid, $drive->{file});
>
> nit: third argument could be $iso_volid
>

Scratching my head how I missed this :).

>> +	my $store_err;
>> +	if ($iso_volid !~ m|^/|) {
>> +	    my $iso_storage  = PVE::Storage::parse_volume_id($iso_volid, 1);
>> +	    eval { PVE::Storage::activate_storage($storecfg, $iso_storage); };
>> +	    $store_err = $@;
>> +	}
>> +	if ($store_err) {
>> +	    if ($drive->{required}) {
>> +		die "cannot access required file: '${ds}: ${iso_volid}': ${store_err}\n";
>> +	    } else {
>> +		log_warn("eject '${ds}: ${iso_volid}': ${store_err}");
>> +		$drive->{file} = 'none';
>> +		$conf->{$ds} = print_drive($drive);
>> +	    }
>> +	} else {
>> +	    if (!file_exists($iso_path)) {
>> +		if ($drive->{required}) {
>> +		    die "required file does not exist: '${ds}: ${iso_volid}'\n";
>> +		} else {
>> +		    log_warn("eject '${ds}: ${iso_volid}': file does not exist");
>> +		    $drive->{file} = 'none';
>> +		    $conf->{$ds} = print_drive($drive);
>> +		}
>> +	    }
>> +	}
>
> nit: the logic between an unavailable storage and an unavailable ISO
> image are very similar (both `$drive->{required} && $store_err` as
> well as `$drive->{required} && !file_exists($iso_path)` have the same
> exit control path), so we could simplify this e.g. to this (changes
> the warning message to a generic message for unavailable storages
> too):
>
> if ($drive->{required}) {
>     die "cannot access required file: '${ds}: ${iso_volid}':
>     ${store_err}\n" if $store_err;
>     die "required file does not exist: '${ds}: ${iso_volid}'\n" if
>     !file_exists($iso_path);
> }
>
> return if !$store_err && file_exists($iso_path);
>
> log_warn("eject '${ds}: ${iso_volid}': storage unavailable or file
> does not exist");
>
> $drive->{file} = 'none';
> $conf->{$ds} = print_drive($drive);
>

Good point, thanks.



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


  reply	other threads:[~2025-01-17 12:32 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-13  8:55 [pve-devel] [PATCH v2 qemu-server, manager 00/12] bugzilla #4225 -- improve handling of unavailable ISOs Daniel Herzig
2025-01-13  8:55 ` [pve-devel] [PATCH v2 1/12] fix #4225: qemuserver: drive: add optional required parameter Daniel Herzig
2025-01-13  8:55 ` [pve-devel] [PATCH v2 2/12] qemuserver: add helper function for mocking files Daniel Herzig
2025-01-16 15:18   ` Daniel Kral
2025-01-17 11:36     ` Daniel Herzig
2025-01-13  8:55 ` [pve-devel] [PATCH v2 3/12] fix #4225: qemuserver: add function to eject isofiles Daniel Herzig
2025-01-16 15:19   ` Daniel Kral
2025-01-17 12:32     ` Daniel Herzig [this message]
2025-01-13  8:56 ` [pve-devel] [PATCH v2 4/12] test: chomp all trailing newlines from errors and warnings Daniel Herzig
2025-01-13  8:56 ` [pve-devel] [PATCH v2 5/12] test: mock cifs-store Daniel Herzig
2025-01-13  8:56 ` [pve-devel] [PATCH v2 6/12] test: add nfs-offline storage Daniel Herzig
2025-01-13  8:56 ` [pve-devel] [PATCH v2 7/12] test: mock existing files Daniel Herzig
2025-01-13  8:56 ` [pve-devel] [PATCH v2 8/12] test: mock log_warn warnings Daniel Herzig
2025-01-13  8:56 ` [pve-devel] [PATCH v2 9/12] test: cfg2cmd: add tests for testing the iso required parameter Daniel Herzig
2025-01-13  8:56 ` [pve-devel] [PATCH v2 10/12] fix #4225: ui: form: isoselector: add optional required checkbox Daniel Herzig
2025-01-13  8:56 ` [pve-devel] [PATCH v2 11/12] fix #4225: ui: qemu: cdedit: enable required checkbox for isos Daniel Herzig
2025-01-16 15:19   ` Daniel Kral
2025-01-17 12:38     ` Daniel Herzig
2025-01-13  8:56 ` [pve-devel] [PATCH v2 12/12] ui: qemu: hardware: add eject button for cdroms Daniel Herzig
2025-01-16 15:19   ` Daniel Kral
2025-01-17 12:47     ` Daniel Herzig
2025-01-23 16:39   ` Friedrich Weber
2025-01-24  7:35     ` Daniel Herzig
2025-01-16 15:18 ` [pve-devel] [PATCH v2 qemu-server, manager 00/12] bugzilla #4225 -- improve handling of unavailable ISOs Daniel Kral
2025-01-17 11:34   ` Daniel Herzig
2025-01-17 13:04     ` Daniel Kral

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=877c6tmxin.fsf@proxmox.com \
    --to=d.herzig@proxmox.com \
    --cc=d.kral@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal