[pve-devel] [PATCH manager] ui: allow specifying shutdown policy during node shutdown/reboot

Fiona Ebner f.ebner at proxmox.com
Mon Jun 19 17:12:25 CEST 2023


Signed-off-by: Fiona Ebner <f.ebner at proxmox.com>
---

Depends on https://lists.proxmox.com/pipermail/pve-devel/2023-June/057635.html

Used a new window, because it's small and couldn't find a good
fit with the existing ones. Maybe SafeDestroy, but not in name and
would require a few modifications too.

Not sure about using gettext() for the option names.

 www/manager6/Makefile               |   1 +
 www/manager6/node/Config.js         |  32 +++----
 www/manager6/window/NodeShutdown.js | 126 ++++++++++++++++++++++++++++
 3 files changed, 139 insertions(+), 20 deletions(-)
 create mode 100644 www/manager6/window/NodeShutdown.js

diff --git a/www/manager6/Makefile b/www/manager6/Makefile
index 9b6dd13b..94c8c05e 100644
--- a/www/manager6/Makefile
+++ b/www/manager6/Makefile
@@ -107,6 +107,7 @@ JSSRC= 							\
 	window/FirewallLograteEdit.js			\
 	window/LoginWindow.js				\
 	window/Migrate.js				\
+	window/NodeShutdown.js				\
 	window/Prune.js					\
 	window/Restore.js				\
 	window/SafeDestroyGuest.js			\
diff --git a/www/manager6/node/Config.js b/www/manager6/node/Config.js
index 6ed2172a..51d9e85d 100644
--- a/www/manager6/node/Config.js
+++ b/www/manager6/node/Config.js
@@ -19,18 +19,6 @@ Ext.define('PVE.node.Config', {
 	    interval: 5000,
 	});
 
-	var node_command = function(cmd) {
-	    Proxmox.Utils.API2Request({
-		params: { command: cmd },
-		url: '/nodes/' + nodename + '/status',
-		method: 'POST',
-		waitMsgTarget: me,
-		failure: function(response, opts) {
-		    Ext.Msg.alert(gettext('Error'), response.htmlStatus);
-		},
-	    });
-	};
-
 	var actionBtn = Ext.create('Ext.Button', {
 	    text: gettext('Bulk Actions'),
 	    iconCls: 'fa fa-fw fa-ellipsis-v',
@@ -83,24 +71,28 @@ Ext.define('PVE.node.Config', {
 	    }),
 	});
 
-	let restartBtn = Ext.create('Proxmox.button.Button', {
+	let restartBtn = Ext.create('Ext.button.Button', {
 	    text: gettext('Reboot'),
 	    disabled: !caps.nodes['Sys.PowerMgmt'],
-	    dangerous: true,
-	    confirmMsg: Ext.String.format(gettext("Reboot node '{0}'?"), nodename),
 	    handler: function() {
-		node_command('reboot');
+		Ext.create('PVE.window.NodeShutdown', {
+		    confirmMsg: Ext.String.format(gettext("Reboot node '{0}'?"), nodename),
+		    url: '/nodes/' + nodename + '/status',
+		    command: 'reboot',
+		}).show();
 	    },
 	    iconCls: 'fa fa-undo',
 	});
 
-	var shutdownBtn = Ext.create('Proxmox.button.Button', {
+	let shutdownBtn = Ext.create('Ext.button.Button', {
 	    text: gettext('Shutdown'),
 	    disabled: !caps.nodes['Sys.PowerMgmt'],
-	    dangerous: true,
-	    confirmMsg: Ext.String.format(gettext("Shutdown node '{0}'?"), nodename),
 	    handler: function() {
-		node_command('shutdown');
+		Ext.create('PVE.window.NodeShutdown', {
+		    confirmMsg: Ext.String.format(gettext("Shutdown node '{0}'?"), nodename),
+		    url: '/nodes/' + nodename + '/status',
+		    command: 'shutdown',
+		}).show();
 	    },
 	    iconCls: 'fa fa-power-off',
 	});
diff --git a/www/manager6/window/NodeShutdown.js b/www/manager6/window/NodeShutdown.js
new file mode 100644
index 00000000..4cdc541c
--- /dev/null
+++ b/www/manager6/window/NodeShutdown.js
@@ -0,0 +1,126 @@
+Ext.define('PVE.window.NodeShutdown', {
+    extend: 'Ext.window.Window',
+    alias: 'widget.pveNodeShutdown',
+    mixins: ['Proxmox.Mixin.CBind'],
+
+    title: gettext('Confirm'),
+    modal: true,
+    buttonAlign: 'center',
+    bodyPadding: 10,
+    width: 450,
+    layout: { type: 'hbox' },
+    defaultFocus: 'nodeShutdownNoButton',
+
+    config: {
+	url: undefined,
+	confirmMsg: undefined,
+	command: undefined,
+    },
+
+    getParams: function() {
+	let me = this;
+	let params = { command: me.getCommand(), };
+
+	let shutdownPolicy = me.lookup('shutdownPolicy').getValue();
+	if (shutdownPolicy && shutdownPolicy !== '__default__') {
+	    params['shutdown-policy'] = shutdownPolicy;
+	}
+
+	return params;
+    },
+
+    controller: {
+	xclass: 'Ext.app.ViewController',
+
+	control: {
+	    'button[reference=yesButton]': {
+		click: function() {
+		    const view = this.getView();
+		    Proxmox.Utils.API2Request({
+			params: view.getParams(),
+			url: view.getUrl(),
+			method: 'POST',
+			waitMsgTarget: view,
+			failure: function(response, opts) {
+			    Ext.Msg.alert(gettext('Error'), response.htmlStatus);
+			},
+			success: function(response, options) {
+			    view.close();
+			},
+		    });
+		},
+	    },
+	    'button[reference=noButton]': {
+		click: function() {
+		    this.getView().close();
+		},
+	    },
+	},
+    },
+
+    buttons: [
+	{
+	    xtype: 'proxmoxHelpButton',
+	    listeners: {
+		beforerender: () => {
+		    Ext.GlobalEvents.fireEvent('proxmoxShowHelp', 'ha_manager_shutdown_policy');
+		},
+	    },
+	},
+	'->',
+	{
+	    reference: 'yesButton',
+	    text: gettext('Yes'),
+	},
+	{
+	    id: 'nodeShutdownNoButton',
+	    reference: 'noButton',
+	    text: gettext('No'),
+	},
+    ],
+
+    items: [
+	{
+	    xtype: 'component',
+	    cls: [
+		Ext.baseCSSPrefix + 'message-box-icon',
+		Ext.baseCSSPrefix + 'message-box-warning',
+		Ext.baseCSSPrefix + 'dlg-icon',
+	    ],
+	},
+	{
+	    xtype: 'container',
+	    flex: 1,
+	    layout: {
+		type: 'vbox',
+		align: 'stretch',
+	    },
+	    items: [
+		{
+		    xtype: 'displayfield',
+		    reference: 'messageCmp',
+		    cbind: {
+			value: '{confirmMsg}',
+		    },
+		},
+		{
+		    reference: 'shutdownPolicy',
+		    fieldLabel: gettext('HA Shutdown Policy'),
+		    labelWidth: 130,
+		    xtype: 'proxmoxKVComboBox',
+		    comboItems: [
+			[
+			    '__default__',
+			    Ext.String.format(gettext("Fallback from {0}"), "datacenter.cfg")
+			],
+			['migrate', gettext("Migrate")],
+			['conditional', gettext("Conditional")],
+			['freeze', gettext("Freeze")],
+			['failover', gettext("Failover")],
+		    ],
+		    value: '__default__',
+		},
+	    ],
+	},
+    ],
+});
-- 
2.39.2






More information about the pve-devel mailing list