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 91C7D612FE for ; Fri, 18 Feb 2022 12:39:04 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 8716429430 for ; Fri, 18 Feb 2022 12:38: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 2318D2938A for ; Fri, 18 Feb 2022 12:38:30 +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 E7D71461BD for ; Fri, 18 Feb 2022 12:38:29 +0100 (CET) From: Aaron Lauterer To: pve-devel@lists.proxmox.com Date: Fri, 18 Feb 2022 12:38:25 +0100 Message-Id: <20220218113827.1415641-5-a.lauterer@proxmox.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220218113827.1415641-1-a.lauterer@proxmox.com> References: <20220218113827.1415641-1-a.lauterer@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SPAM-LEVEL: Spam detection results: 0 AWL 0.012 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 manager 4/6] api: mon: mds: osd: add safety check endpoints 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, 18 Feb 2022 11:39:04 -0000 for mon, mds and osd: ok-to-stop mon: ok-to-rm osd: safe-to-destroy Signed-off-by: Aaron Lauterer --- I added the OSD safe-to-destroy endpoint even though I have no immediate use for it as of now. But plan to include it in the OSD panel once I have an idea how to do so in a sensible manner. The main problem with safe-to-destroy is, that it only works if the OSD is still running and by the time we enable the destroy button, the OSD needs to be stopped. PVE/API2/Ceph/MDS.pm | 50 ++++++++++++++++++++++ PVE/API2/Ceph/MON.pm | 100 +++++++++++++++++++++++++++++++++++++++++++ PVE/API2/Ceph/OSD.pm | 100 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 250 insertions(+) diff --git a/PVE/API2/Ceph/MDS.pm b/PVE/API2/Ceph/MDS.pm index 1cb0b74f..2ed3cf5a 100644 --- a/PVE/API2/Ceph/MDS.pm +++ b/PVE/API2/Ceph/MDS.pm @@ -230,4 +230,54 @@ __PACKAGE__->register_method ({ } }); +__PACKAGE__->register_method ({ + name => 'oktostop', + path => '{name}/ok-to-stop', + method => 'GET', + description => "Check if it is ok to stop the MON", + proxyto => 'node', + protected => 1, + permissions => { + check => ['perm', '/', [ 'Sys.Modify' ]], + }, + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node'), + name => { + type => 'string', + pattern => PVE::Ceph::Services::SERVICE_REGEX, + description => 'The name (ID) of the mds', + }, + }, + }, + returns => { + type => "object", + }, + code => sub { + my ($param) = @_; + + PVE::Ceph::Tools::check_ceph_inited(); + + my $name = $param->{name}; + my $rados = PVE::RADOS->new(); + + my $result = { + ok_to_stop => 0, + status => '', + }; + + my $code; + my $status; + eval { + ($code, $status) = $rados->mon_command({ prefix => 'mds ok-to-stop', format => 'plain', ids => [ $name ] }, 1); + }; + die $@ if $@; + + $result->{ok_to_stop} = $code == 0 ? 1 : 0; + $result->{status} = $status; + + return $result; + }}); + 1; diff --git a/PVE/API2/Ceph/MON.pm b/PVE/API2/Ceph/MON.pm index 12c9caf0..49d15f12 100644 --- a/PVE/API2/Ceph/MON.pm +++ b/PVE/API2/Ceph/MON.pm @@ -591,4 +591,104 @@ __PACKAGE__->register_method ({ return $rpcenv->fork_worker('cephdestroymon', $monsection, $authuser, $worker); }}); +__PACKAGE__->register_method ({ + name => 'oktostop', + path => '{monid}/ok-to-stop', + method => 'GET', + description => "Check if it is ok to stop the MON", + proxyto => 'node', + protected => 1, + permissions => { + check => ['perm', '/', [ 'Sys.Modify' ]], + }, + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node'), + monid => { + type => 'string', + pattern => PVE::Ceph::Services::SERVICE_REGEX, + description => "The ID for the monitor", + }, + }, + }, + returns => { + type => "object", + }, + code => sub { + my ($param) = @_; + + PVE::Ceph::Tools::check_ceph_inited(); + + my $monid = $param->{monid}; + my $rados = PVE::RADOS->new(); + + my $result = { + ok_to_stop => 0, + status => '', + }; + + my $code; + my $status; + eval { + ($code, $status) = $rados->mon_command({ prefix => 'mon ok-to-stop', format => 'plain', ids => [ $monid ] }, 1); + }; + die $@ if $@; + + $result->{ok_to_stop} = $code == 0 ? 1 : 0; + $result->{status} = $status; + + return $result; + }}); + +__PACKAGE__->register_method ({ + name => 'oktorm', + path => '{monid}/ok-to-rm', + method => 'GET', + description => "Check if it is ok to remove the MON", + proxyto => 'node', + protected => 1, + permissions => { + check => ['perm', '/', [ 'Sys.Modify' ]], + }, + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node'), + monid => { + type => 'string', + pattern => PVE::Ceph::Services::SERVICE_REGEX, + description => "The ID for the monitor", + }, + }, + }, + returns => { + type => "object", + }, + code => sub { + my ($param) = @_; + + PVE::Ceph::Tools::check_ceph_inited(); + + my $monid = $param->{monid}; + my $rados = PVE::RADOS->new(); + + my $result = { + ok_to_rm => 0, + status => '', + }; + + my $code; + my $status; + eval { + ($code, $status) = $rados->mon_command({ prefix => 'mon ok-to-rm', format => 'plain', id => $monid }, 1); + }; + die $@ if $@; + + $result->{ok_to_rm} = $code == 0 ? 1 : 0; + $result->{status} = $status; + + return $result; + }}); + 1; diff --git a/PVE/API2/Ceph/OSD.pm b/PVE/API2/Ceph/OSD.pm index 26d61e3b..7a7599e2 100644 --- a/PVE/API2/Ceph/OSD.pm +++ b/PVE/API2/Ceph/OSD.pm @@ -825,4 +825,104 @@ __PACKAGE__->register_method ({ return undef; }}); +__PACKAGE__->register_method ({ + name => 'oktostop', + path => '{osdid}/ok-to-stop', + method => 'GET', + description => "Check if it is ok to stop the OSD", + proxyto => 'node', + protected => 1, + permissions => { + check => ['perm', '/', [ 'Sys.Modify' ]], + }, + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node'), + osdid => { + description => 'OSD ID', + type => 'integer', + }, + }, + }, + returns => { + type => "object", + }, + code => sub { + my ($param) = @_; + + PVE::Ceph::Tools::check_ceph_inited(); + + my $osdid = $param->{osdid}; + my $rados = PVE::RADOS->new(); + $get_osd_status->($rados, $osdid); # osd exists? + + my $result = { + ok_to_stop => 0, + status => '', + }; + + my $code; + my $status; + eval { + ($code, $status) = $rados->mon_command({ prefix => 'osd ok-to-stop', format => 'plain', ids => [ $osdid ] }, 1); + }; + die $@ if $@; + + $result->{ok_to_stop} = $code == 0 ? 1 : 0; + $result->{status} = $status; + + return $result; + }}); + +__PACKAGE__->register_method ({ + name => 'safetodestroy', + path => '{osdid}/safe-to-destroy', + method => 'GET', + description => "Check if it is safe to destroy the OSD", + proxyto => 'node', + protected => 1, + permissions => { + check => ['perm', '/', [ 'Sys.Modify' ]], + }, + parameters => { + additionalProperties => 0, + properties => { + node => get_standard_option('pve-node'), + osdid => { + description => 'OSD ID', + type => 'integer', + }, + }, + }, + returns => { + type => "object", + }, + code => sub { + my ($param) = @_; + + PVE::Ceph::Tools::check_ceph_inited(); + + my $osdid = $param->{osdid}; + my $rados = PVE::RADOS->new(); + $get_osd_status->($rados, $osdid); # osd exists? + + my $result = { + safe_to_destroy => 0, + status => '', + }; + + my $code; + my $status; + eval { + ($code, $status) = $rados->mon_command({ prefix => 'osd safe-to-destroy', format => 'plain', ids => [ $osdid ] }, 1); + }; + die $@ if $@; + + $result->{safe_to_destroy} = $code == 0 ? 1 : 0; + $result->{status} = $status; + + return $result; + }}); + 1; -- 2.30.2