public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [PATCH manager] ui: ha: add disarm/re-arm button
@ 2026-04-14 11:51 Dominik Rusovac
  2026-04-14 13:30 ` Daniel Kral
  2026-04-15  6:44 ` Dominik Rusovac
  0 siblings, 2 replies; 4+ messages in thread
From: Dominik Rusovac @ 2026-04-14 11:51 UTC (permalink / raw)
  To: pve-devel

The button to disarm HA in either of the resource modes ('freeze' or
'ignore') is disabled as long as HA is disarmed. Analogously, the
re-arming button is disabled as long as HA is not disarmed.

The icons ('unlink' and 'link') are chosen to emphasize that
"Disarm HA" and "Re-arm HA" are complements. There may be more
suitable pairs of icons though.

Signed-off-by: Dominik Rusovac <d.rusovac@proxmox.com>
---
 www/manager6/ha/Status.js     | 106 ++++++++++++++++++++++++++++++++++
 www/manager6/ha/StatusView.js |   8 +++
 2 files changed, 114 insertions(+)

diff --git a/www/manager6/ha/Status.js b/www/manager6/ha/Status.js
index b0b0feb9..d955452d 100644
--- a/www/manager6/ha/Status.js
+++ b/www/manager6/ha/Status.js
@@ -8,6 +8,107 @@ Ext.define('PVE.ha.Status', {
         align: 'stretch',
     },
 
+    viewModel: {
+        data: {
+            haDisarmed: false,
+        },
+    },
+
+    controller: {
+        xclass: 'Ext.app.ViewController',
+
+        check_ha_status: function (isDisarmed) {
+            let vm = this.getViewModel();
+            vm.set('haDisarmed', isDisarmed);
+        },
+
+        disarm: function (comp) {
+            let me = this;
+            let view = me.getView();
+            let mode = comp.mode;
+
+            Ext.Msg.confirm(
+                gettext('Confirm'),
+                mode === 'freeze'
+                    ? gettext("Are you sure you want to disarm HA with resource mode 'freeze'?")
+                    : gettext("Are you sure you want to disarm HA with resource mode 'ignore'?"),
+                function (btn) {
+                    if (btn !== 'yes') {
+                        return;
+                    }
+                    Proxmox.Utils.API2Request({
+                        url: '/cluster/ha/status/disarm-ha',
+                        params: { 'resource-mode': mode },
+                        method: 'POST',
+                        waitMsgTarget: view,
+                        failure: (response) => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
+                    });
+                },
+            );
+        },
+
+        rearm: function () {
+            let me = this;
+            let view = me.getView();
+
+            Ext.Msg.confirm(
+                gettext('Confirm'),
+                gettext('Are you sure you want to re-arm HA?'),
+                function (btn) {
+                    if (btn !== 'yes') {
+                        return;
+                    }
+                    Proxmox.Utils.API2Request({
+                        url: '/cluster/ha/status/arm-ha',
+                        params: {},
+                        method: 'POST',
+                        waitMsgTarget: view,
+                        failure: (response) => Ext.Msg.alert(gettext('Error'), response.htmlStatus),
+                    });
+                },
+            );
+        },
+    },
+
+    dockedItems: [
+        {
+            xtype: 'toolbar',
+            dock: 'top',
+            items: [
+                {
+                    text: gettext('Disarm HA'),
+                    iconCls: 'fa fa-unlink',
+                    bind: {
+                        disabled: '{haDisarmed}',
+                    },
+                    menu: [
+                        {
+                            text: gettext('Freeze'),
+                            iconCls: 'fa fa-snowflake-o',
+                            mode: 'freeze',
+                            handler: 'disarm',
+                        },
+                        {
+                            text: gettext('Ignore'),
+                            iconCls: 'fa fa-eye-slash',
+                            mode: 'ignore',
+                            handler: 'disarm',
+                        },
+                    ],
+                },
+                {
+                    text: gettext('Re-arm HA'),
+                    iconCls: 'fa fa-link',
+                    bind: {
+                        disabled: '{!haDisarmed}',
+                    },
+                    handler: 'rearm',
+                },
+            ],
+        },
+    ],
+
+
     initComponent: function () {
         var me = this;
 
@@ -30,6 +131,11 @@ Ext.define('PVE.ha.Status', {
                 border: 0,
                 collapsible: true,
                 padding: '0 0 20 0',
+                listeners: {
+                    hastatuschange: function (isDisarmed) {
+                        me.getController().check_ha_status(isDisarmed);
+                    },
+                },
             },
             {
                 xtype: 'pveHAResourcesView',
diff --git a/www/manager6/ha/StatusView.js b/www/manager6/ha/StatusView.js
index bc2da71f..4cbe85a1 100644
--- a/www/manager6/ha/StatusView.js
+++ b/www/manager6/ha/StatusView.js
@@ -42,6 +42,13 @@ Ext.define(
                 },
             });
 
+            me.rstore.on('load', function () {
+                let fencing = store.findRecord('type', 'fencing');
+                let disarmed = fencing && fencing.get('armed-state') === 'disarmed';
+
+                me.fireEvent('hastatuschange', disarmed);
+            });
+
             Ext.apply(me, {
                 store: store,
                 stateful: false,
@@ -105,6 +112,7 @@ Ext.define(
                         return PVE.data.ResourceStore.guestName(vmid);
                     },
                 },
+                'armed-state',
             ],
             idProperty: 'id',
         });
-- 
2.47.3





^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2026-04-15  6:44 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-04-14 11:51 [PATCH manager] ui: ha: add disarm/re-arm button Dominik Rusovac
2026-04-14 13:30 ` Daniel Kral
2026-04-14 13:49   ` Dominik Rusovac
2026-04-15  6:44 ` Dominik Rusovac

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal