for mon, mds and osd: ok-to-stop mon: ok-to-rm osd: safe-to-destroy Signed-off-by: Aaron Lauterer <a.laute...@proxmox.com> ---
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 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel