]> git.proxmox.com Git - pve-manager.git/blobdiff - PVE/API2/Ceph.pm
api: ceph: add cmd-safety endpoint
[pve-manager.git] / PVE / API2 / Ceph.pm
index 3bbcfe4c792618e864aff5f30dff13df923050d3..f344240877856f6c041c2789c81c34a0cc44572a 100644 (file)
@@ -641,4 +641,100 @@ __PACKAGE__->register_method ({
        return $res;
     }});
 
+__PACKAGE__->register_method ({
+    name => 'cmd_safety',
+    path => 'cmd-safety',
+    method => 'GET',
+    description => "Heuristical check if it is safe to perform an action.",
+    proxyto => 'node',
+    protected => 1,
+    permissions => {
+       check => ['perm', '/', [ 'Sys.audit' ]],
+    },
+    parameters => {
+       additionalProperties => 0,
+       properties => {
+           node => get_standard_option('pve-node'),
+           service => {
+               description => 'Service type',
+               type => 'string',
+               enum => ['osd', 'mon', 'mds'],
+           },
+           id => {
+               description => 'ID of the service',
+               type => 'string',
+           },
+           action => {
+               description => 'Action to check',
+               type => 'string',
+               enum => ['stop', 'destroy'],
+           },
+       },
+    },
+    returns => {
+       type => 'object',
+       properties => {
+          safe  => {
+               type => 'boolean',
+               description => 'If it is safe to run the command.',
+           },
+           status => {
+               type => 'string',
+               optional => 1,
+               description => 'Status message given by Ceph.'
+           },
+       },
+    },
+    code => sub {
+       my ($param) = @_;
+
+       PVE::Ceph::Tools::check_ceph_inited();
+
+       my $id = $param->{id};
+       my $service = $param->{service};
+       my $action = $param->{action};
+
+       my $rados = PVE::RADOS->new();
+
+       my $supported_actions = {
+           osd => {
+               stop => 'ok-to-stop',
+               destroy => 'safe-to-destroy',
+           },
+           mon => {
+               stop => 'ok-to-stop',
+               destroy => 'ok-to-rm',
+           },
+           mds => {
+               stop => 'ok-to-stop',
+           },
+       };
+
+       die "Service does not support this action: ${service}: ${action}\n"
+           if !$supported_actions->{$service}->{$action};
+
+       my $result = {
+           safe => 0,
+           status => '',
+       };
+
+       my $params = {
+           prefix => "${service} $supported_actions->{$service}->{$action}",
+           format => 'plain',
+       };
+       if ($service eq 'mon' && $action eq 'destroy') {
+           $params->{id} = $id;
+       } else {
+           $params->{ids} = [ $id ];
+       }
+
+       $result = $rados->mon_cmd($params, 1);
+       die $@ if $@;
+
+       $result->{safe} = $result->{return_code} == 0 ? 1 : 0;
+       $result->{status} = $result->{status_message};
+
+       return $result;
+    }});
+
 1;