[pve-devel] [PATCH common v3 2/3] fix #3893: network: add vlan id and range parameter definitions

Shannon Sterz s.sterz at proxmox.com
Fri Jul 26 14:22:15 CEST 2024


On Wed Jul 3, 2024 at 10:01 AM CEST, Aaron Lauterer wrote:
> This is one step to make it possible to define the VLAN IDs and ranges
> for bridges.
>
> It is expected to be used in combination with the `-list` magic
> property. Therefore it defines and checks the validity of a single list
> item that could just be a single VLAN tag ID or a range.
>
> Signed-off-by: Aaron Lauterer <a.lauterer at proxmox.com>
> ---
> changes since v2:
> * renamed schema to a more generic one with the use case of the guest
>   trunk config in mind
>
>  src/PVE/JSONSchema.pm | 34 ++++++++++++++++++++++++++++++++++
>  1 file changed, 34 insertions(+)
>
> diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm
> index 115f811..22fe048 100644
> --- a/src/PVE/JSONSchema.pm
> +++ b/src/PVE/JSONSchema.pm
> @@ -81,6 +81,12 @@ register_standard_option('pve-iface', {
>      minLength => 2, maxLength => 20,
>  });
>
> +register_standard_option('pve-vlan-id-or-range', {
> +    description => "VLAN ID or range.",
> +    type => 'string', format => 'pve-vlan-id-or-range',
> +    minLength => 1, maxLength => 9,
> +});
> +
>  register_standard_option('pve-storage-id', {
>      description => "The storage identifier.",
>      type => 'string', format => 'pve-storage-id',
> @@ -595,6 +601,34 @@ sub pve_verify_iface {
>      return $id;
>  }
>
> +# vlan id (vids), single or range
> +register_format('pve-vlan-id-or-range', \&pve_verify_vlan_id_or_range);
> +sub pve_verify_vlan_id_or_range {
> +    my ($vlan, $noerr) = @_;
> +
> +    my $check_vid = sub {
> +	my $tag = shift;
> +	if ( $tag < 2 || $tag > 4094) {
> +	    return undef if $noerr;
> +	    die "invalid VLAN tag '$tag'\n";
> +	}
> +    };
> +
> +    if ($vlan !~ m/^(\d+)([-](\d+))?$/i) {

nit: pretty sure you can ommit the [] brackets here and you could use a
non-capturing group to get this somewhat cleaner regex:

^(\d+)(?:-(\d+))?$

also not sure this needs to be case insensitive, but it's probably fine.

by using a non capturing group you don't get the useless "-" in the
second group...

> +	return undef if $noerr;
> +	die "invalid VLAN configuration '$vlan'\n";
> +    }
> +    my $start = $1;
> +    my $end = $3;

... so this becomes:

    my $end = $2;

> +    return  undef if (!defined $check_vid->($start));

nit: there is an extra space here.

> +    if ($end) {
> +	return undef if (!defined $check_vid->($end));
> +	die "VLAN range must go from lower to higher tag '$vlan'" if $start >= $end && !$noerr;
> +    }
> +
> +    return $vlan;
> +}
> +
>  # general addresses by name or IP
>  register_format('address', \&pve_verify_address);
>  sub pve_verify_address {





More information about the pve-devel mailing list