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 DC25B7065D for ; Fri, 22 Jul 2022 14:26:22 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id D301E324A for ; Fri, 22 Jul 2022 14:25:52 +0200 (CEST) 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 for ; Fri, 22 Jul 2022 14:25:51 +0200 (CEST) Received: from proxmox-new.maurer-it.com (localhost.localdomain [127.0.0.1]) by proxmox-new.maurer-it.com (Proxmox) with ESMTP id 36DB543B00 for ; Fri, 22 Jul 2022 14:25:51 +0200 (CEST) Date: Fri, 22 Jul 2022 14:25:49 +0200 From: Wolfgang Bumiller To: Stefan Hrdlicka Cc: pve-devel@lists.proxmox.com Message-ID: <20220722122549.e7jtwfdhy2bymluh@wobu-vie.proxmox.com> References: <20220720144949.1568323-1-s.hrdlicka@proxmox.com> <20220720144949.1568323-2-s.hrdlicka@proxmox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20220720144949.1568323-2-s.hrdlicka@proxmox.com> X-SPAM-LEVEL: Spam detection results: 0 AWL 0.278 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 Subject: Re: [pve-devel] [PATCH pve-container 1/3] fix #3711: enable delete of LXC container via force option 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: Fri, 22 Jul 2022 12:26:22 -0000 On Wed, Jul 20, 2022 at 04:49:47PM +0200, Stefan Hrdlicka wrote: > Make it possible to delete a container whoes underlying storage is no > longer available. This will just write an warning instead of dying. "no longer available" != "throws errors" (see below (*)) > > Without setting the option force-remove-storage=1 a delete will still > fail, like it did before the changes. With this option set it will try to > delete the volume from the storage. If this fails it writes a warning. > > Signed-off-by: Stefan Hrdlicka > --- > src/PVE/API2/LXC.pm | 8 ++++++++ > src/PVE/LXC.pm | 20 +++++++++++++++----- > 2 files changed, 23 insertions(+), 5 deletions(-) > > diff --git a/src/PVE/API2/LXC.pm b/src/PVE/API2/LXC.pm > index 589f96f..4d785c9 100644 > --- a/src/PVE/API2/LXC.pm > +++ b/src/PVE/API2/LXC.pm > @@ -697,6 +697,13 @@ __PACKAGE__->register_method({ > ." enabled storages which are not referenced in the config.", > optional => 1, > }, > + 'force-remove-storage' => { This name is a bit confusing as instead of enforcing removal you're actually ignoring the case where removal *fails*, iow.: you allow *not* removing data. The `create_vm` call has an `ignore-unpack-errors` parameter, so maybe `ignore-storage-errors` would work here. (And renaming all the $variables accordingly.) > + type => 'boolean', > + description => 'If set, this will ignore errors when trying to remove LXC' (*) when documenting it as ignoring errors, I would not expect it to distinguish between unavailable storages and _other_ errors happening. Side note: Almost all our API docs just refer to them as 'containers', the 'LXC' portion can be dropped here. > + . ' container storage.', > + default => 0, > + optional => 1, > + } > }, > }, > returns => { > @@ -758,6 +765,7 @@ __PACKAGE__->register_method({ > $conf, > { lock => 'destroyed' }, > $param->{'destroy-unreferenced-disks'}, > + $param->{'force-remove-storage'}, > ); > > PVE::AccessControl::remove_vm_access($vmid); > diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm > index fe63087..74c8d17 100644 > --- a/src/PVE/LXC.pm > +++ b/src/PVE/LXC.pm > @@ -848,13 +848,22 @@ sub get_primary_ips { > } > > sub delete_mountpoint_volume { > - my ($storage_cfg, $vmid, $volume) = @_; > + my ($storage_cfg, $vmid, $volume, $force_remove_storage) = @_; > > return if PVE::LXC::Config->classify_mountpoint($volume) ne 'volume'; > > - my ($vtype, $name, $owner) = PVE::Storage::parse_volname($storage_cfg, $volume); > + my ($vtype, $name, $owner); > + eval { > + ($vtype, $name, $owner) = PVE::Storage::parse_volname($storage_cfg, $volume); > + }; ^ It is not clear to me why you'd cover this, but not the `vdisk_free` below, unless you're trying to catch only specific errors (but this is not specific enough...) I think this sub can be left unchanged and instead the `delete_mountpoint_volume()` call itself could be wrapped in an `eval{}` instead. > > - if ($vmid == $owner) { > + if (!$force_remove_storage && $@) { > + die $@; > + } elsif ($@) { > + # $force_remove_storage == true is implied here > + warn "storage not available, can't remove $volume disk image, continuing!\n" > + . "error: $@\n"; > + } elsif ($vmid == $owner) { > PVE::Storage::vdisk_free($storage_cfg, $volume); > } else { > warn "ignore deletion of '$volume', CT $vmid isn't the owner!\n"; > @@ -862,7 +871,8 @@ sub delete_mountpoint_volume { > } > > sub destroy_lxc_container { > - my ($storage_cfg, $vmid, $conf, $replacement_conf, $purge_unreferenced) = @_; > + my ($storage_cfg, $vmid, $conf, $replacement_conf, > + $purge_unreferenced, $force_remove_storage) = @_; > > my $volids = {}; > my $remove_volume = sub { > @@ -873,7 +883,7 @@ sub destroy_lxc_container { > return if $volids->{$volume}; > $volids->{$volume} = 1; > > - delete_mountpoint_volume($storage_cfg, $vmid, $volume); > + delete_mountpoint_volume($storage_cfg, $vmid, $volume, $force_remove_storage); So I think I'd just put an `eval{}` here, not pass the parameter through, and just `die $@ if $@ && !$ignore_storage_errrors` afterwards. > }; > PVE::LXC::Config->foreach_volume_full($conf, {include_unused => 1}, $remove_volume); > > -- > 2.30.2