From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <pve-devel-bounces@lists.proxmox.com>
Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68])
	by lore.proxmox.com (Postfix) with ESMTPS id 7596B1FF15E
	for <inbox@lore.proxmox.com>; Fri, 26 Jul 2024 14:22:21 +0200 (CEST)
Received: from firstgate.proxmox.com (localhost [127.0.0.1])
	by firstgate.proxmox.com (Proxmox) with ESMTP id 2573A1DDC0;
	Fri, 26 Jul 2024 14:22:23 +0200 (CEST)
Mime-Version: 1.0
Date: Fri, 26 Jul 2024 14:22:19 +0200
Message-Id: <D2ZGTTIBD4PC.2JZIEZ35LOL91@proxmox.com>
From: "Shannon Sterz" <s.sterz@proxmox.com>
To: "Proxmox VE development discussion" <pve-devel@lists.proxmox.com>
X-Mailer: aerc 0.17.0-69-g65571b67d7d3-dirty
References: <20240703080147.81154-1-a.lauterer@proxmox.com>
 <20240703080147.81154-5-a.lauterer@proxmox.com>
In-Reply-To: <20240703080147.81154-5-a.lauterer@proxmox.com>
X-SPAM-LEVEL: Spam detection results:  0
 AWL -0.049 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
 SPF_HELO_NONE           0.001 SPF: HELO does not publish an SPF Record
 SPF_PASS               -0.001 SPF: sender matches SPF record
Subject: Re: [pve-devel] [PATCH widget-toolkit v3] fix #3892: Network: add
 bridge vids field for bridge_vids
X-BeenThere: pve-devel@lists.proxmox.com
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Proxmox VE development discussion <pve-devel.lists.proxmox.com>
List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pve-devel>, 
 <mailto:pve-devel-request@lists.proxmox.com?subject=unsubscribe>
List-Archive: <http://lists.proxmox.com/pipermail/pve-devel/>
List-Post: <mailto:pve-devel@lists.proxmox.com>
List-Help: <mailto:pve-devel-request@lists.proxmox.com?subject=help>
List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel>, 
 <mailto:pve-devel-request@lists.proxmox.com?subject=subscribe>
Reply-To: Proxmox VE development discussion <pve-devel@lists.proxmox.com>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Errors-To: pve-devel-bounces@lists.proxmox.com
Sender: "pve-devel" <pve-devel-bounces@lists.proxmox.com>

On Wed Jul 3, 2024 at 10:01 AM CEST, Aaron Lauterer wrote:
> The new optional bridge_vids field allows to set that property via the
> GUI. Since the backend needs to support it, the field needs to be
> explicitly enabled.
>
> For now, Proxmox VE (PVE) is the use case.
>
> Signed-off-by: Aaron Lauterer <a.lauterer@proxmox.com>
> ---
> changes since v2:
> * added validation code following how it is implemented in the API
>
>  src/node/NetworkEdit.js | 62 +++++++++++++++++++++++++++++++++++++++++
>  src/node/NetworkView.js |  5 ++++
>  2 files changed, 67 insertions(+)
>
> diff --git a/src/node/NetworkEdit.js b/src/node/NetworkEdit.js
> index 27c1baf..8c1b135 100644
> --- a/src/node/NetworkEdit.js
> +++ b/src/node/NetworkEdit.js
> @@ -2,6 +2,9 @@ Ext.define('Proxmox.node.NetworkEdit', {
>      extend: 'Proxmox.window.Edit',
>      alias: ['widget.proxmoxNodeNetworkEdit'],
>
> +    // Enable to show the VLAN ID field
> +    bridge_set_vids: false,
> +
>      initComponent: function() {
>  	let me = this;
>
> @@ -57,11 +60,67 @@ Ext.define('Proxmox.node.NetworkEdit', {
>  	}
>
>  	if (me.iftype === 'bridge') {
> +	    let vids = Ext.create('Ext.form.field.Text', {
> +		fieldLabel: gettext('Bridge VIDS'),
> +		name: 'bridge_vids',
> +		emptyText: '2-4094',
> +		disabled: true,
> +		autoEl: {
> +		    tag: 'div',
> +		    'data-qtip': gettext('Space-separated list of VLANs and ranges, for example: 2 4 100-200'),
> +		},
> +		validator: function(value) {
> +		    if (!value) { return true; } // Empty

nit: our js style guide state that single line ifs should be avoided

> +		    let result = true;
> +
> +		    let vid_list = value.split(' ');
> +
> +		    let checkVid = function(tag) {
> +			if (tag < 2 || tag > 4094) {
> +			    return `not a valid VLAN ID '${tag}'`;
> +			}
> +			return true;
> +		    };
> +
> +		    for (const vid of vid_list) {
> +			if (!vid) {
> +			    continue;
> +			}
> +			let res = vid.match(/^(\d+)([-](\d+))?$/i);

nit: see my comment for patch 2.

> +			if (!res) {
> +			    return `not a valid VLAN configuration '${vid}'`;
> +			}
> +			let start = Number(res[1]);
> +			let end = Number(res[3]);
> +
> +			if (start) {
> +			    result = checkVid(start);
> +			    if (result !== true) { return result; }

same here...

> +			}
> +			if (end) {
> +			    result = checkVid(end);
> +			    if (result !== true) { return result; }

and here. it might be more elegant to do this:

    let invalidVid = function(tag) {
        if (!isNaN(tag) && (tag < 2 || tag > 4094)) {
            return `not a valid VLAN ID '${tag}'`;
        }

        return false;
    };

// [..]

        if (res = invalidVid(start)) {
            return res;
        }

        if (res = invalidVid(end)) {
            return res;
        }

`Number(res[n])` should return `NaN` if `res[n]` is undefined, this
shouldn't be the case for start ever but is relevant for `end`.

> +			}
> +
> +			if (start >= end) {
> +			    return `VID range must go from lower to higher tag: '${vid}'`;
> +			}
> +		    }
> +		    return true;
> +		},
> +	    });
>  	    column2.push({
>  		xtype: 'proxmoxcheckbox',
>  		fieldLabel: gettext('VLAN aware'),
>  		name: 'bridge_vlan_aware',
>  		deleteEmpty: !me.isCreate,
> +		listeners: {
> +		    change: function(f, newVal) {
> +			if (me.bridge_set_vids) {
> +			    vids.setDisabled(!newVal);
> +			}
> +		    },
> +		},
>  	    });
>  	    column2.push({
>  		xtype: 'textfield',
> @@ -72,6 +131,9 @@ Ext.define('Proxmox.node.NetworkEdit', {
>  		    'data-qtip': gettext('Space-separated list of interfaces, for example: enp0s0 enp1s0'),
>  		},
>  	    });
> +	    if (me.bridge_set_vids) {
> +		advancedColumn2.push(vids);
> +	    }
>  	} else if (me.iftype === 'OVSBridge') {
>  	    column2.push({
>  		xtype: 'textfield',
> diff --git a/src/node/NetworkView.js b/src/node/NetworkView.js
> index 1d67ac8..c08cbfa 100644
> --- a/src/node/NetworkView.js
> +++ b/src/node/NetworkView.js
> @@ -33,6 +33,9 @@ Ext.define('Proxmox.node.NetworkView', {
>
>      showApplyBtn: false,
>
> +    // decides if VLAN IDs field for bridges is shown, depends on the product if needed
> +    bridge_set_vids: false,
> +
>      initComponent: function() {
>  	let me = this;
>
> @@ -100,6 +103,7 @@ Ext.define('Proxmox.node.NetworkView', {
>  		nodename: me.nodename,
>  		iface: rec.data.iface,
>  		iftype: rec.data.type,
> +		bridge_set_vids: me.bridge_set_vids,
>  		listeners: {
>  		    destroy: () => reload(),
>  		},
> @@ -170,6 +174,7 @@ Ext.define('Proxmox.node.NetworkView', {
>  		    nodename: me.nodename,
>  		    iftype: iType,
>  		    iface_default: findNextFreeInterfaceId(iDefault ?? iType),
> +		    bridge_set_vids: me.bridge_set_vids,
>  		    onlineHelp: 'sysadmin_network_configuration',
>  		    listeners: {
>  			destroy: () => reload(),



_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel