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 5B55A1FF13F for ; Thu, 12 Mar 2026 11:22:46 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 10C86EA6B; Thu, 12 Mar 2026 11:22:42 +0100 (CET) Date: Thu, 12 Mar 2026 11:22:38 +0100 From: Gabriel Goller To: Hannes Laimer Subject: Re: [PATCH pve-manager v5 1/1] sdn: add dry-run diff view for sdn apply Message-ID: Mail-Followup-To: Hannes Laimer , pve-devel@lists.proxmox.com References: <20260310120705.150425-1-g.goller@proxmox.com> <20260310120705.150425-20-g.goller@proxmox.com> <95393f67-fb49-4d99-962a-4e27fbc82151@proxmox.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <95393f67-fb49-4d99-962a-4e27fbc82151@proxmox.com> User-Agent: NeoMutt/20241002-35-39f9a6 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1773310922728 X-SPAM-LEVEL: Spam detection results: 0 AWL -1.045 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 KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment RCVD_IN_MSPIKE_H2 0.001 Average reputation (+2) RCVD_IN_VALIDITY_CERTIFIED_BLOCKED 0.408 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_RPBL_BLOCKED 0.819 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. RCVD_IN_VALIDITY_SAFE_BLOCKED 0.903 ADMINISTRATOR NOTICE: The query to Validity was blocked. See https://knowledge.validity.com/hc/en-us/articles/20961730681243 for more information. SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Message-ID-Hash: X4NOSZMJ5RWKR3W6MK7LZDOWZ3ZY3L5E X-Message-ID-Hash: X4NOSZMJ5RWKR3W6MK7LZDOWZ3ZY3L5E X-MailFrom: g.goller@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: pve-devel@lists.proxmox.com X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: On 12.03.2026 08:58, Hannes Laimer wrote: > On 2026-03-10 13:07, Gabriel Goller wrote: > > Introduce a new SdnDiffView modal that runs a dry-run and shows the frr > > and ifupdown2 configuration changes which will be made when clicking > > apply. Now the user knows which config options will be set without > > needing to apply the config. > > > > Signed-off-by: Gabriel Goller > > --- > > www/manager6/Makefile | 1 + > > www/manager6/sdn/SdnDiffView.js | 149 ++++++++++++++++++++++++++++++++ > > www/manager6/sdn/StatusView.js | 8 ++ > > 3 files changed, 158 insertions(+) > > create mode 100644 www/manager6/sdn/SdnDiffView.js > > > > diff --git a/www/manager6/sdn/SdnDiffView.js b/www/manager6/sdn/SdnDiffView.js > > new file mode 100644 > > index 000000000000..e32e4cf896c4 > > --- /dev/null > > +++ b/www/manager6/sdn/SdnDiffView.js > > @@ -0,0 +1,149 @@ > > +Ext.define('PVE.sdn.SdnDiffView', { > > + extend: 'Ext.window.Window', > > + > > [snip] > > + loadDiff: async function () { > > + let me = this; > > + > > + let req = await Proxmox.Async.api2({ > > + url: `/cluster/sdn/dry-run`, > > + params: { node: me.node }, > > + method: 'GET', > > + }); > > + > > + return req.result.data; > > + }, > > + > > + load: function () { > > + let me = this; > > + > > + me.setLoading('fetching node diff'); > > + > > + me.loadDiff() > > + .catch(Proxmox.Utils.alertResponseFailure) > > I think this should be .then(..).catch(..) Ack. > > + .then((diff) => { > > + if (diff['frr-diff'] === null) { > > + this.getViewModel().set('frr_diff', 'no changes'); > > + } else { > > + this.getViewModel().set('frr_diff', '
' + diff['frr-diff'] + '
'); > > we should probably `Ext.htmlEncode(diff['frr-diff'])`, this does > container user config. The IS-IS controller domain field for example > allows free-text ... > > ``` >

:P onerror="alert(document.cookie.match(/PVEAuthCookie=([^;]+)/)?.[1])">

> ``` > will work > > > + } > > + if (diff['interfaces-diff'] === null) { > > + this.getViewModel().set('interfaces_diff', 'no changes'); > > + } else { > > + this.getViewModel().set( > > + 'interfaces_diff', > > + '
' + diff['interfaces-diff'] + '
', > > ... here as well Makes sense, thanks for the review! > > + ); > > + } > > + }) > > + .finally(() => { > > + me.setLoading(false); > > + }); > > + }, > > + > > + getNodeSelector: function () { > > + let me = this; > > + > > + return Ext.create('PVE.form.NodeSelector', { > > + xtype: 'pveNodeSelector', > > + reference: 'nodeselector', > > + fieldLabel: gettext('Node'), > > + padding: 10, > > + labelWidth: 120, > > + name: 'node', > > + allowBlank: false, > > + listeners: { > > + change: function (f, value) { > > + me.node = value; > > + me.load(); > > + }, > > + }, > > + listConfig: { > > + columns: [ > > + { > > + header: gettext('Node'), > > + dataIndex: 'node', > > + sortable: true, > > + hideable: false, > > + flex: 1, > > + }, > > + ], > > + }, > > + store: { > > + fields: ['node'], > > + proxy: { > > + type: 'proxmox', > > + url: '/api2/json/nodes', > > + }, > > + sorters: [ > > + { > > + property: 'node', > > + direction: 'ASC', > > + }, > > + ], > > + }, > > + }); > > + }, > > + > > + initComponent: function () { > > + let me = this; > > + > > + me.nodeSelector = me.getNodeSelector(); > > + > > + me.items = [me.nodeSelector, ...me.items]; > > + > > + me.callParent(); > > + }, > > +}); > > diff --git a/www/manager6/sdn/StatusView.js b/www/manager6/sdn/StatusView.js > > index fbc712c6cf6b..fada50411e91 100644 > > --- a/www/manager6/sdn/StatusView.js > > +++ b/www/manager6/sdn/StatusView.js > > @@ -69,6 +69,14 @@ Ext.define( > > }); > > }, > > }, > > + { > > + text: gettext('Dry-Run'), > > + handler: function () { > > + Ext.create('PVE.sdn.SdnDiffView', { > > + autoShow: true, > > + }); > > + }, > > + }, > > ], > > viewConfig: { > > trackOver: false, >