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

Reply via email to