From ce5460f0380a60eb07f70dfed29d1b011636448a Mon Sep 17 00:00:00 2001
From: Nataliia S <81954790+natali-rs1985@users.noreply.github.com>
Date: Mon, 8 Jul 2024 18:51:40 +0300
Subject: vxlan: T6505: Support VXLAN VLAN-VNI range mapping in CLI (#3756)

(cherry picked from commit 115e99630a317cab62c6f99e0461f6ce2c1edaf3)
---
 python/vyos/ifconfig/vxlan.py | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 deletions(-)

(limited to 'python')

diff --git a/python/vyos/ifconfig/vxlan.py b/python/vyos/ifconfig/vxlan.py
index 918aea202..1023c58d1 100644
--- a/python/vyos/ifconfig/vxlan.py
+++ b/python/vyos/ifconfig/vxlan.py
@@ -134,6 +134,19 @@ class VXLANIf(Interface):
         Controls whether vlan to tunnel mapping is enabled on the port.
         By default this flag is off.
         """
+        def range_to_dict(vlan_to_vni):
+            """ Converts dict of ranges to dict """
+            result_dict = {}
+            for vlan, vlan_conf in vlan_to_vni.items():
+                vni = vlan_conf['vni']
+                vlan_range, vni_range = vlan.split('-'), vni.split('-')
+                if len(vlan_range) > 1:
+                    vlan_range = range(int(vlan_range[0]), int(vlan_range[1]) + 1)
+                    vni_range = range(int(vni_range[0]), int(vni_range[1]) + 1)
+                dict_to_add = {str(k): {'vni': str(v)} for k, v in zip(vlan_range, vni_range)}
+                result_dict.update(dict_to_add)
+            return result_dict
+
         if not isinstance(state, bool):
             raise ValueError('Value out of range')
 
@@ -142,7 +155,7 @@ class VXLANIf(Interface):
             if dict_search('parameters.vni_filter', self.config) != None:
                 cur_vni_filter = get_vxlan_vni_filter(self.ifname)
 
-            for vlan, vlan_config in self.config['vlan_to_vni_removed'].items():
+            for vlan, vlan_config in range_to_dict(self.config['vlan_to_vni_removed']).items():
                 # If VNI filtering is enabled, remove matching VNI filter
                 if cur_vni_filter != None:
                     vni = vlan_config['vni']
@@ -159,10 +172,11 @@ class VXLANIf(Interface):
 
         if 'vlan_to_vni' in self.config:
             # Determine current OS Kernel configured VLANs
+            vlan_vni_mapping = range_to_dict(self.config['vlan_to_vni'])
             os_configured_vlan_ids = get_vxlan_vlan_tunnels(self.ifname)
-            add_vlan = list_diff(list(self.config['vlan_to_vni'].keys()), os_configured_vlan_ids)
+            add_vlan = list_diff(list(vlan_vni_mapping.keys()), os_configured_vlan_ids)
 
-            for vlan, vlan_config in self.config['vlan_to_vni'].items():
+            for vlan, vlan_config in vlan_vni_mapping.items():
                 # VLAN mapping already exists - skip
                 if vlan not in add_vlan:
                     continue
-- 
cgit v1.2.3