From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 0C25D1FF186 for ; Sat, 20 Sep 2025 20:21:20 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 6E11E275AB; Sat, 20 Sep 2025 20:21:28 +0200 (CEST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758392478; x=1758997278; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=KTVspWowOil/HJ7i4M/fF4YmvQYWaz8tWEvTGF8jLx0=; b=xFNNKZh2pR5XCNh4Sc2NuUw9eOzPhud+t61LYSDxU+SOwMQiJUMoRUfjpe3RXJXiHM j+3Pt2ZLWpO0lRQOv0OfgCxjEqHOBrKJI8a0YxkcD+pOqzv2Ruz43EZ+2l4yR634S2r5 +FGAkDAtfpiHA5RBPzGQM2B7aKh+lQfKlk8HvbVA5GVjQ8EUVrlbyZGRyQASMQoJBFYk JYQudD8Cj6MsWka2S0W4UPY7mp/XvOXqCg/zmmJVKrFln9VKat/ninA+nx1dbRr6LxgA Ex8FHeDnycd+kwF1x2RIMNBsnOH08tkTKm/nUgguxyZyVubMPxHQsjVbud3Y2Maivkt8 zGpQ== X-Gm-Message-State: AOJu0Yxgbxikt8j1LUwLjA1B+1dKiG9HBSPUmlWzesz+MUKHQe4X0DPh lCu2TLK3K9GQxVTMPXnu7vZbJHVn8UOqthcFbW+OaE6taqsLZ8CM1CzQx1pwnhdRp4U= X-Gm-Gg: ASbGncv5f65lgT7cV6I2KAd+d60VnGWSAFUws0vzxk4NC+fwca38jpPJYAsxfcmZ71w 7y7YHLT/dkyWfcZESduLY85k2PS9SfwEP8pcHmIOnep9qNhvN+SG5DeNfOF7sHaD8ZcHwoJp91y 77iJuYzah6L7Kg0SIh1fjMGNIyJdnTQs24stBmBebOW4+0ByJQABTx/VZ2EfmuCIjL5Dn8/Qc/r zf/hJVXkDSiv9cwIWchLJ9bIgsjdrJ9lDdz0R8VPVMjIz9iCCUr9MU4HVQ3tCdeerPlD3d7Yi/w nMeXr6uSNLzCpUyaq5F/4BbKsg4FWF9fMx5YWxL8oqaR2E975JHyL8TTzypxFnE267jg3sCb7h1 53wbKx8R0wSuRUWHXh9r8qA1sIZkCk/Y/zwo5u9JFjDHFe6dfPXHsCAMc9ITGaFSOcjxebo+omJ nXCSsW825oabAuq7tSTMcDKmKjQpphjuzFd+8= X-Google-Smtp-Source: AGHT+IEX0J+CTaaGI7pFi7fqcBURmgr2Uw1sxnrVHIhKsTqC4vY+EX7K0VlcbYDp1Brrt9s4JN3Aiw== X-Received: by 2002:a05:690e:245b:b0:632:e952:31c with SMTP id 956f58d0204a3-633bcf640e5mr6270402d50.14.1758392478424; Sat, 20 Sep 2025 11:21:18 -0700 (PDT) From: Thomas Skinner To: pve-devel@lists.proxmox.com Date: Sat, 20 Sep 2025 13:20:50 -0500 Message-ID: <20250920182050.1657928-5-thomas@atskinner.net> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250920182050.1657928-1-thomas@atskinner.net> References: <20250920182050.1657928-1-thomas@atskinner.net> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.009 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy FREEMAIL_FORGED_FROMDOMAIN 0.001 2nd level domains in From and EnvelopeFrom freemail headers are different FREEMAIL_FROM 0.001 Sender email is commonly abused enduser mail provider HEADER_FROM_DIFFERENT_DOMAINS 0.001 From and EnvelopeFrom 2nd level mail domains are different KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_DNSWL_NONE -0.0001 Sender listed at https://www.dnswl.org/, no trust RCVD_IN_MSPIKE_H2 0.001 Average reputation (+2) SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pve-devel] [PATCH manager v2 2/2] add UI for node maintenance enable/disable X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Cc: Thomas Skinner Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" Signed-off-by: Thomas Skinner --- www/manager6/ha/StatusView.js | 92 +++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/www/manager6/ha/StatusView.js b/www/manager6/ha/StatusView.js index 50ad8e84..4163f637 100644 --- a/www/manager6/ha/StatusView.js +++ b/www/manager6/ha/StatusView.js @@ -41,12 +41,75 @@ Ext.define( }, }); + let sm = Ext.create('Ext.selection.RowModel', {}); + + let caps = Ext.state.Manager.get('GuiCap'); + + let setNodeMaintenance = function (setEnabled) { + let rec = sm.getSelection()[0]; + if (!rec || rec.data.type !== 'lrm') { + return; + } + let nodeName = rec.get('node'); + let enableText = setEnabled ? 'Enable' : 'Disable'; + let msg = Ext.String.format( + gettext("{0} maintenance mode on node '{1}'?"), + enableText, + nodeName, + ); + Ext.Msg.confirm(gettext('Confirm'), msg, (btn) => { + if (btn === 'yes') { + Proxmox.Utils.API2Request({ + params: { 'maintenance-mode': setEnabled ? 'enable' : 'disable' }, + url: '/nodes/' + nodeName + '/maintenance', + method: 'PUT', + waitMsgTarget: me, + failure: function (response, opts) { + Ext.Msg.alert(gettext('Error'), response.htmlStatus); + }, + }); + } + }); + }; + + let setMaintenanceButtonStates = function (isLRM, isMaintenance) { + me.down('#nodeMaintenanceMenu').setDisabled(!(caps.nodes['Sys.Console'] && isLRM)); + me.down('#nodeMaintenanceEnableBtn').setDisabled(isMaintenance); + me.down('#nodeMaintenanceDisableBtn').setDisabled(!isMaintenance); + }; + Ext.apply(me, { store: store, + selModel: sm, stateful: false, viewConfig: { trackOver: false, }, + tbar: [ + { + text: gettext('Maintenance Mode'), + itemId: 'nodeMaintenanceMenu', + disabled: true, + menu: new Ext.menu.Menu({ + items: [ + { + text: gettext('Enable'), + itemId: 'nodeMaintenanceEnableBtn', + iconCls: 'fa fa-wrench', + disabled: true, + handler: () => setNodeMaintenance(true), + }, + { + text: gettext('Disable'), + itemId: 'nodeMaintenanceDisableBtn', + iconCls: 'fa fa-check', + disabled: true, + handler: () => setNodeMaintenance(false), + }, + ], + }), + }, + ], columns: [ { header: gettext('Type'), @@ -60,12 +123,40 @@ Ext.define( dataIndex: 'status', }, ], + listeners: { + beforeselect: function (tree, record, index, eopts) { + if (record) { + let isLRM = record.data.type === 'lrm'; + let isMaintenance = record.data.lrm_mode === 'maintenance'; + setMaintenanceButtonStates(isLRM, isMaintenance); + } + }, + }, }); me.callParent(); me.on('activate', me.rstore.startUpdate); me.on('destroy', me.rstore.stopUpdate); + + me.mon(me.rstore, 'load', function (curstore, results) { + let rec = sm.getSelection()[0]; + if (!rec || rec.data.type !== 'lrm') { + return; + } + for (const { data } of results) { + switch (data.type) { + case 'lrm': + if (rec.data.node === data.node) { + let isMaintenance = rec.data.lrm_mode === 'maintenance'; + setMaintenanceButtonStates(true, isMaintenance); + } + break; + default: + break; + } + } + }); }, }, function () { @@ -88,6 +179,7 @@ Ext.define( 'type', 'crm_state', 'request_state', + 'lrm_mode', { name: 'vname', convert: function (value, record) { -- 2.47.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel