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 0852077E9F for ; Mon, 25 Oct 2021 15:48:08 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 7361623792 for ; Mon, 25 Oct 2021 15:48:07 +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 id 239CE23641 for ; Mon, 25 Oct 2021 15:48:00 +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 ED706465C0 for ; Mon, 25 Oct 2021 15:47:59 +0200 (CEST) From: Fabian Ebner To: pve-devel@lists.proxmox.com Date: Mon, 25 Oct 2021 15:47:45 +0200 Message-Id: <20211025134755.169491-3-f.ebner@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20211025134755.169491-1-f.ebner@proxmox.com> References: <20211025134755.169491-1-f.ebner@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.263 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: [pve-devel] [PATCH storage 2/6] api: disks: add DELETE endpoint for directory, lvm, lvmthin, zfs 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: Mon, 25 Oct 2021 13:48:08 -0000 Signed-off-by: Fabian Ebner --- PVE/API2/Disks/Directory.pm | 44 +++++++++++++++++++++++++++++++++++++ PVE/API2/Disks/LVM.pm | 35 +++++++++++++++++++++++++++++ PVE/API2/Disks/LVMThin.pm | 42 +++++++++++++++++++++++++++++++++++ PVE/API2/Disks/ZFS.pm | 40 +++++++++++++++++++++++++++++++++ 4 files changed, 161 insertions(+) diff --git a/PVE/API2/Disks/Directory.pm b/PVE/API2/Disks/Directory.pm index 3a90a2e..36cebbc 100644 --- a/PVE/API2/Disks/Directory.pm +++ b/PVE/API2/Disks/Directory.pm @@ -3,6 +3,8 @@ package PVE::API2::Disks::Directory; use strict; use warnings; +use POSIX; + use PVE::Diskmanage; use PVE::JSONSchema qw(get_standard_option); use PVE::RESTHandler; @@ -301,4 +303,46 @@ __PACKAGE__->register_method ({ return $rpcenv->fork_worker('dircreate', $name, $user, $worker); }}); +__PACKAGE__->register_method ({ + name => 'delete', + path => '{name}', + method => 'DELETE', + proxyto => 'node', + protected => 1, + permissions => { + check => ['perm', '/', ['Sys.Modify', 'Datastore.Allocate']], + }, + description => "Unmounts the storage and removes the mount unit.", + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node'), + name => get_standard_option('pve-storage-id'), + }, + }, + returns => { type => 'string' }, + code => sub { + my ($param) = @_; + + my $rpcenv = PVE::RPCEnvironment::get(); + my $user = $rpcenv->get_user(); + + my $name = $param->{name}; + + my $worker = sub { + my $path = "/mnt/pve/$name"; + my $mountunitname = PVE::Systemd::escape_unit($path, 1) . ".mount"; + my $mountunitpath = "/etc/systemd/system/$mountunitname"; + + PVE::Diskmanage::locked_disk_action(sub { + run_command(['systemctl', 'stop', $mountunitname]); + run_command(['systemctl', 'disable', $mountunitname]); + + unlink $mountunitpath or $! == ENOENT or die "cannot remove $mountunitpath - $!\n"; + }); + }; + + return $rpcenv->fork_worker('dirremove', $name, $user, $worker); + }}); + 1; diff --git a/PVE/API2/Disks/LVM.pm b/PVE/API2/Disks/LVM.pm index 885e02b..ee9e282 100644 --- a/PVE/API2/Disks/LVM.pm +++ b/PVE/API2/Disks/LVM.pm @@ -187,4 +187,39 @@ __PACKAGE__->register_method ({ return $rpcenv->fork_worker('lvmcreate', $name, $user, $worker); }}); +__PACKAGE__->register_method ({ + name => 'delete', + path => '{name}', + method => 'DELETE', + proxyto => 'node', + protected => 1, + permissions => { + check => ['perm', '/', ['Sys.Modify', 'Datastore.Allocate']], + }, + description => "Remove an LVM Volume Group.", + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node'), + name => get_standard_option('pve-storage-id'), + }, + }, + returns => { type => 'string' }, + code => sub { + my ($param) = @_; + + my $rpcenv = PVE::RPCEnvironment::get(); + my $user = $rpcenv->get_user(); + + my $name = $param->{name}; + + my $worker = sub { + PVE::Diskmanage::locked_disk_action(sub { + PVE::Storage::LVMPlugin::lvm_destroy_volume_group($name); + }); + }; + + return $rpcenv->fork_worker('lvmremove', $name, $user, $worker); + }}); + 1; diff --git a/PVE/API2/Disks/LVMThin.pm b/PVE/API2/Disks/LVMThin.pm index 83ebc46..6c0a458 100644 --- a/PVE/API2/Disks/LVMThin.pm +++ b/PVE/API2/Disks/LVMThin.pm @@ -161,4 +161,46 @@ __PACKAGE__->register_method ({ return $rpcenv->fork_worker('lvmthincreate', $name, $user, $worker); }}); +__PACKAGE__->register_method ({ + name => 'delete', + path => '{name}', + method => 'DELETE', + proxyto => 'node', + protected => 1, + permissions => { + check => ['perm', '/', ['Sys.Modify', 'Datastore.Allocate']], + }, + description => "Remove an LVM thin pool.", + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node'), + name => get_standard_option('pve-storage-id'), + 'volume-group' => get_standard_option('pve-storage-id'), + }, + }, + returns => { type => 'string' }, + code => sub { + my ($param) = @_; + + my $rpcenv = PVE::RPCEnvironment::get(); + my $user = $rpcenv->get_user(); + + my $vg = $param->{'volume-group'}; + my $lv = $param->{name}; + + my $worker = sub { + PVE::Diskmanage::locked_disk_action(sub { + my $thinpools = PVE::Storage::LvmThinPlugin::list_thinpools(); + + die "no such thin pool ${vg}/${lv}\n" + if !grep { $_->{lv} eq $lv && $_->{vg} eq $vg } $thinpools->@*; + + run_command(['lvremove', '-y', "${vg}/${lv}"]); + }); + }; + + return $rpcenv->fork_worker('lvmthinremove', "${vg}-${lv}", $user, $worker); + }}); + 1; diff --git a/PVE/API2/Disks/ZFS.pm b/PVE/API2/Disks/ZFS.pm index 7f96bb7..e8d5e7c 100644 --- a/PVE/API2/Disks/ZFS.pm +++ b/PVE/API2/Disks/ZFS.pm @@ -449,4 +449,44 @@ __PACKAGE__->register_method ({ return $rpcenv->fork_worker('zfscreate', $name, $user, $worker); }}); +__PACKAGE__->register_method ({ + name => 'delete', + path => '{name}', + method => 'DELETE', + proxyto => 'node', + protected => 1, + permissions => { + check => ['perm', '/', ['Sys.Modify', 'Datastore.Allocate']], + }, + description => "Destroy a ZFS pool.", + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node'), + name => get_standard_option('pve-storage-id'), + }, + }, + returns => { type => 'string' }, + code => sub { + my ($param) = @_; + + my $rpcenv = PVE::RPCEnvironment::get(); + my $user = $rpcenv->get_user(); + + my $name = $param->{name}; + + my $worker = sub { + PVE::Diskmanage::locked_disk_action(sub { + if (-e '/lib/systemd/system/zfs-import@.service') { + my $importunit = 'zfs-import@' . PVE::Systemd::escape_unit($name) . '.service'; + run_command(['systemctl', 'disable', $importunit]); + } + + run_command(['zpool', 'destroy', $name]); + }); + }; + + return $rpcenv->fork_worker('zfsremove', $name, $user, $worker); + }}); + 1; -- 2.30.2