]> git.proxmox.com Git - pve-manager.git/commitdiff
ui: osd: mon: mds: warn if stop/destroy actions are problematic
authorAaron Lauterer <a.lauterer@proxmox.com>
Thu, 17 Nov 2022 14:10:02 +0000 (15:10 +0100)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Thu, 17 Nov 2022 17:27:48 +0000 (18:27 +0100)
Check if stopping of a service (OSD, MON, MDS) will be problematic for
Ceph. The warning still allows the user to proceed.

Ceph also has a check if the destruction of a MON is okay, so let's use
it.

Instead of the common OK button, label it with `Stop OSD` and so forth
to hopefully reduce the "click OK by habit" incidents.

This will not catch it every time as Ceph can need a few moments after a
change to establish its current status. For example, stopping one of 3
MONs and then right away destroying one of the last two running MONs
will most likely not trigger the warning. Doing so after a few seconds
should show the warning though.

Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
www/manager6/ceph/OSD.js
www/manager6/ceph/ServiceList.js

index b36787f52e6170e8e8f734a566ce5aa8f93e523f..6f7e2159e1fb9b5587d4c9eba9bc76bac7a918d3 100644 (file)
@@ -527,23 +527,60 @@ Ext.define('PVE.node.CephOsdTree', {
            let me = this;
            let vm = this.getViewModel();
            let cmd = comp.cmd || comp;
-           Proxmox.Utils.API2Request({
-                url: "/nodes/" + vm.get('osdhost') + "/ceph/" + cmd,
-               params: { service: "osd." + vm.get('osdid') },
-               waitMsgTarget: me.getView(),
-               method: 'POST',
-               success: function(response, options) {
-                   let upid = response.result.data;
-                   let win = Ext.create('Proxmox.window.TaskProgress', {
-                       upid: upid,
-                       taskDone: () => { me.reload(); },
-                   });
-                   win.show();
-               },
-               failure: function(response, opts) {
-                   Ext.Msg.alert(gettext('Error'), response.htmlStatus);
-               },
-           });
+
+           let doRequest = function() {
+               Proxmox.Utils.API2Request({
+                   url: `/nodes/${vm.get('osdhost')}/ceph/${cmd}`,
+                   params: { service: "osd." + vm.get('osdid') },
+                   waitMsgTarget: me.getView(),
+                   method: 'POST',
+                   success: function(response, options) {
+                       let upid = response.result.data;
+                       let win = Ext.create('Proxmox.window.TaskProgress', {
+                           upid: upid,
+                           taskDone: () => { me.reload(); },
+                       });
+                       win.show();
+                   },
+                   failure: function(response, opts) {
+                       Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+                   },
+               });
+           };
+
+           if (cmd === "stop") {
+               Proxmox.Utils.API2Request({
+                   url: `/nodes/${vm.get('osdhost')}/ceph/cmd-safety`,
+                   params: {
+                       service: 'osd',
+                       id: vm.get('osdid'),
+                       action: 'stop',
+                   },
+                   waitMsgTarget: me.getView(),
+                   method: 'GET',
+                   success: function({ result: { data } }) {
+                       if (!data.safe) {
+                           Ext.Msg.show({
+                               title: gettext('Warning'),
+                               message: data.status,
+                               icon: Ext.Msg.WARNING,
+                               buttons: Ext.Msg.OKCANCEL,
+                               buttonText: { ok: gettext('Stop OSD') },
+                               fn: function(selection) {
+                                   if (selection === 'ok') {
+                                       doRequest();
+                                   }
+                               },
+                           });
+                       } else {
+                           doRequest();
+                       }
+                   },
+                   failure: response => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
+               });
+           } else {
+               doRequest();
+           }
        },
 
        set_selection_status: function(tp, selection) {
index 9298974e8c46f1cbe21987b488892ad85394a9bd..8b51fe6a65c9fb6a6c23a4938e8f67ef5c22e849 100644 (file)
@@ -148,19 +148,57 @@ Ext.define('PVE.node.CephServiceController', {
            Ext.Msg.alert(gettext('Error'), "entry has no host");
            return;
        }
-       Proxmox.Utils.API2Request({
-                                 url: `/nodes/${rec.data.host}/ceph/${cmd}`,
-                                 method: 'POST',
-                                 params: { service: view.type + '.' + rec.data.name },
-                                 success: function(response, options) {
-                                     Ext.create('Proxmox.window.TaskProgress', {
-                                         autoShow: true,
-                                         upid: response.result.data,
-                                         taskDone: () => view.rstore.load(),
-                                     });
-                                 },
-                                 failure: (response, _opts) => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
-       });
+       let doRequest = function() {
+           Proxmox.Utils.API2Request({
+               url: `/nodes/${rec.data.host}/ceph/${cmd}`,
+               method: 'POST',
+               params: { service: view.type + '.' + rec.data.name },
+               success: function(response, options) {
+                   Ext.create('Proxmox.window.TaskProgress', {
+                       autoShow: true,
+                       upid: response.result.data,
+                       taskDone: () => view.rstore.load(),
+                   });
+               },
+               failure: (response, _opts) => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
+           });
+       };
+       if (cmd === "stop" && ['mon', 'mds'].includes(view.type)) {
+           Proxmox.Utils.API2Request({
+               url: `/nodes/${rec.data.host}/ceph/cmd-safety`,
+               params: {
+                   service: view.type,
+                   id: rec.data.name,
+                   action: 'stop',
+               },
+               method: 'GET',
+               success: function({ result: { data } }) {
+                   let stopText = {
+                       mon: gettext('Stop MON'),
+                       mds: gettext('Stop MDS'),
+                   };
+                   if (!data.safe) {
+                       Ext.Msg.show({
+                           title: gettext('Warning'),
+                           message: data.status,
+                           icon: Ext.Msg.WARNING,
+                           buttons: Ext.Msg.OKCANCEL,
+                           buttonText: { ok: stopText[view.type] },
+                           fn: function(selection) {
+                               if (selection === 'ok') {
+                                   doRequest();
+                               }
+                           },
+                       });
+                   } else {
+                       doRequest();
+                   }
+               },
+               failure: (response, _opts) => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
+           });
+       } else {
+           doRequest();
+       }
     },
     onChangeService: function(button) {
        let me = this;
@@ -273,6 +311,46 @@ Ext.define('PVE.node.CephServiceList', {
                    taskDone: () => view.rstore.load(),
                });
            },
+           handler: function(btn, event, rec) {
+               let me = this;
+               let view = me.up('grid');
+               let doRequest = function() {
+                   Proxmox.button.StdRemoveButton.prototype.handler.call(me, btn, event, rec);
+               };
+               if (view.type === 'mon') {
+                   Proxmox.Utils.API2Request({
+                       url: `/nodes/${rec.data.host}/ceph/cmd-safety`,
+                       params: {
+                           service: view.type,
+                           id: rec.data.name,
+                           action: 'destroy',
+                       },
+                       method: 'GET',
+                       success: function({ result: { data } }) {
+                           if (!data.safe) {
+                               Ext.Msg.show({
+                                   title: gettext('Warning'),
+                                   message: data.status,
+                                   icon: Ext.Msg.WARNING,
+                                   buttons: Ext.Msg.OKCANCEL,
+                                   buttonText: { ok: gettext('Destroy MON') },
+                                   fn: function(selection) {
+                                       if (selection === 'ok') {
+                                           doRequest();
+                                       }
+                                   },
+                               });
+                           } else {
+                               doRequest();
+                           }
+                       },
+                       failure: (response, _opts) => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
+                   });
+               } else {
+                   doRequest();
+               }
+           },
+
        },
        '-',
        {