From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate001.proxmox.com (gate001.proxmox.com [45.144.208.40]) by lore.proxmox.com (Postfix) with ESMTPS id 862FE1FF0AA for ; Fri, 21 Aug 2026 16:05:54 +0200 (CEST) Received: from gate001.proxmox.com (localhost.localdomain [127.0.0.1]) by gate001.proxmox.com (Proxmox) with ESMTP id 914A1217DB; Fri, 21 Aug 2026 16:04:28 +0200 (CEST) From: Gabriel Goller To: pve-devel@lists.proxmox.com Subject: [PATCH pve-manager 14/15] ui: sdn: add VRF zone selection for fabrics Date: Fri, 21 Aug 2026 16:03:58 +0200 Message-ID: <20260821140404.322081-15-g.goller@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260821140404.322081-1-g.goller@proxmox.com> References: <20260821140404.322081-1-g.goller@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1787321023702 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.576 Adjusted score from AWL reputation of From: address DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment (newer systems) RCVD_IN_DNSWL_MED -2.3 Sender listed at https://www.dnswl.org/, medium trust SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_CSS_A 0.1 Contains URL's A record listed in the Spamhaus CSS blocklist [104.247.81.99] Message-ID-Hash: REGIY7LYR7MKDBVW6FITHNI222G6NB4X X-Message-ID-Hash: REGIY7LYR7MKDBVW6FITHNI222G6NB4X 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 X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: Allow BGP and OSPF fabrics to use the VRF created by a simple zone. The selector ignores simple zones that use the default VRF, because they do not create separate VRF and thus don't isolate the fabrics. Leaving the field empty keeps the fabric in the default VRF. Add the default VRF option to the simple zone editor so users can control whether a zone creates its own VRF. Signed-off-by: Gabriel Goller --- www/manager6/form/SDNZoneSelector.js | 12 +++++++++++- www/manager6/sdn/fabrics/FabricEdit.js | 18 ++++++++++++++++++ www/manager6/sdn/zones/SimpleEdit.js | 12 +++++++++++- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/www/manager6/form/SDNZoneSelector.js b/www/manager6/form/SDNZoneSelector.js index d8a63baeb7bd..4813539cb62a 100644 --- a/www/manager6/form/SDNZoneSelector.js +++ b/www/manager6/form/SDNZoneSelector.js @@ -8,6 +8,9 @@ Ext.define( valueField: 'zone', displayField: 'zone', + // Only show simple zones which create a dedicated VRF. + vrfOnly: false, + initComponent: function () { var me = this; @@ -17,6 +20,13 @@ Ext.define( property: 'zone', direction: 'ASC', }, + filters: me.vrfOnly + ? [ + function (record) { + return record.get('type') === 'simple' && !record.get('default-vrf'); + }, + ] + : [], }); Ext.apply(me, { @@ -42,7 +52,7 @@ Ext.define( function () { Ext.define('pve-sdn-zone', { extend: 'Ext.data.Model', - fields: ['zone', 'type'], + fields: ['zone', 'type', { name: 'default-vrf', type: 'boolean', defaultValue: true }], proxy: { type: 'proxmox', url: '/api2/json/cluster/sdn/zones', diff --git a/www/manager6/sdn/fabrics/FabricEdit.js b/www/manager6/sdn/fabrics/FabricEdit.js index e9e0d1fa6286..b3992b294b93 100644 --- a/www/manager6/sdn/fabrics/FabricEdit.js +++ b/www/manager6/sdn/fabrics/FabricEdit.js @@ -37,6 +37,19 @@ Ext.define('PVE.sdn.Fabric.Fabric.Edit', { disabled: '{!isCreate}', }, }, + { + xtype: 'pveSDNZoneSelector', + fieldLabel: gettext('VRF Zone'), + labelWidth: 120, + name: 'zone', + vrfOnly: true, + allowBlank: true, + skipEmptyText: true, + emptyText: gettext('Default VRF'), + cbind: { + deleteEmpty: '{!isCreate}', + }, + }, ], additionalItems: [], @@ -50,6 +63,11 @@ Ext.define('PVE.sdn.Fabric.Fabric.Edit', { me.autoLoad = !me.isCreate; me.method = me.isCreate ? 'POST' : 'PUT'; + let supportsVrf = ['bgp', 'ospf'].includes(me.extraRequestParams.protocol); + let vrfZoneField = me.items.find((item) => item.name === 'zone'); + vrfZoneField.hidden = !supportsVrf; + vrfZoneField.disabled = !supportsVrf; + if (!me.isCreate) { me.url = `${me.baseUrl}/${me.fabricId}`; } else { diff --git a/www/manager6/sdn/zones/SimpleEdit.js b/www/manager6/sdn/zones/SimpleEdit.js index ba10bb3616ea..4ec77057a6e5 100644 --- a/www/manager6/sdn/zones/SimpleEdit.js +++ b/www/manager6/sdn/zones/SimpleEdit.js @@ -18,7 +18,17 @@ Ext.define('PVE.sdn.zones.SimpleInputPanel', { initComponent: function () { var me = this; - me.items = []; + me.items = [ + { + xtype: 'proxmoxcheckbox', + name: 'default-vrf', + fieldLabel: gettext('Create zone in default VRF'), + checked: true, + uncheckedValue: 0, + defaultValue: 1, + deleteDefaultValue: !me.isCreate, + }, + ]; me.advancedItems = [ { xtype: 'proxmoxcheckbox', -- 2.47.3