33from ..utils import log
44from . import _Quirks , need_ansible_collection , report_quirk
55
6+ EXOS_VLAN_1_NAME = 'Default'
67
78def check_vrrp_address_families (node : Box ) -> None :
89 for intf in node .interfaces :
@@ -17,11 +18,51 @@ def check_vrrp_address_families(node: Box) -> None:
1718 category = log .IncorrectType )
1819 return
1920
21+ def rename_interface_vlan_references (intf : Box , old_name : str , new_name : str ) -> None :
22+ for kw in ('vlan.access' ,'vlan.native' ,'vlan.name' ,'vlan_name' ,'_vlan_native' ):
23+ if intf .get (kw ,None ) == old_name :
24+ intf [kw ] = new_name
25+
26+ trunk = intf .get ('vlan.trunk' ,None )
27+ if trunk and old_name in trunk :
28+ trunk [new_name ] = trunk .pop (old_name )
29+
30+ def default_vlan_1 (node : Box ) -> None :
31+ if 'vlans' not in node :
32+ return
33+
34+ if EXOS_VLAN_1_NAME in node .vlans and node .vlans [EXOS_VLAN_1_NAME ].id != 1 :
35+ report_quirk (
36+ text = f'{ EXOS_VLAN_1_NAME } VLAN must have VLAN tag 1' ,
37+ node = node ,
38+ category = log .IncorrectValue )
39+ return
40+
41+ vlan_1_name = next (
42+ (vname for vname ,vdata in node .vlans .items ()
43+ if vdata .get ('id' ,None ) == 1 and vname != EXOS_VLAN_1_NAME ),
44+ None )
45+ if not vlan_1_name :
46+ return
47+
48+ node .vlans [EXOS_VLAN_1_NAME ] = node .vlans .pop (vlan_1_name )
49+
50+ for intf in node .interfaces :
51+ rename_interface_vlan_references (intf ,vlan_1_name ,EXOS_VLAN_1_NAME )
52+
53+ report_quirk (
54+ text = 'Extreme EXOS reserves VLAN ID 1 for the built-in Default VLAN' ,
55+ more_data = f'Renaming VLAN { vlan_1_name } to { EXOS_VLAN_1_NAME } on node { node .name } ' ,
56+ node = node ,
57+ quirk = 'vlan.default_1' ,
58+ category = Warning )
2059
2160class EXOS (_Quirks ):
2261
2362 @classmethod
2463 def device_quirks (cls , node : Box , topology : Box ) -> None :
64+ if 'vlan' in node .get ('module' ,[]):
65+ default_vlan_1 (node )
2566 if 'gateway' in node .get ('module' ,[]):
2667 check_vrrp_address_families (node )
2768
0 commit comments