Skip to content
Snippets Groups Projects

Support ASN dot notation.

Merged Neda Moeini requested to merge feature/DBOARD3-719-support-extended-asn-notation into develop
All threads resolved!
2 files
+ 51
2
Compare changes
  • Side-by-side
  • Inline
Files
2
@@ -243,6 +243,36 @@ def list_interfaces(netconf_config):
@@ -243,6 +243,36 @@ def list_interfaces(netconf_config):
yield u
yield u
 
def asn_to_int(asn_string: str) -> int:
 
"""
 
Convert a possibly dotted ASN to an integer.
 
 
Args:
 
asn_string (str): ASN to be converted, can be in dot notation or not.
 
 
Returns:
 
int: ASN in integer format.
 
 
Raises:
 
ValueError: If the ASN string is not in the expected format or exceeds valid range.
 
"""
 
 
dotted_asn_pattern = re.compile(r'^(\d+)\.(\d+)$')
 
match = dotted_asn_pattern.match(asn_string)
 
 
if match:
 
high_order, low_order = map(int, match.groups())
 
 
if high_order > 0xffff or low_order > 0xffff:
 
raise ValueError(f'Invalid ASN format: {asn_string}. Both components must be <= 0xffff.')
 
 
return (high_order << 16) | low_order
 
elif asn_string.isdigit():
 
return int(asn_string)
 
else:
 
raise ValueError(f'Unable to parse ASN string: {asn_string}. Expected either a pure integer or a dot notation.')
 
 
def _system_bgp_peers(system_node):
def _system_bgp_peers(system_node):
def _peering_params(neighbor_node):
def _peering_params(neighbor_node):
@@ -251,11 +281,11 @@ def _system_bgp_peers(system_node):
@@ -251,11 +281,11 @@ def _system_bgp_peers(system_node):
peer_as = neighbor_node.find('peer-as')
peer_as = neighbor_node.find('peer-as')
if peer_as is not None:
if peer_as is not None:
# lxml usage warning: can't just test `if peer_as:`
# lxml usage warning: can't just test `if peer_as:`
info['remote-asn'] = int(peer_as.text)
info['remote-asn'] = asn_to_int(peer_as.text)
local_as = neighbor_node.find('local-as')
local_as = neighbor_node.find('local-as')
if local_as is not None:
if local_as is not None:
asn_value_node = local_as.find('as-number')
asn_value_node = local_as.find('as-number')
info['local-asn'] = int(asn_value_node.text)
info['local-asn'] = asn_to_int(asn_value_node.text)
description = neighbor_node.find('description')
description = neighbor_node.find('description')
if description is not None:
if description is not None:
# lxml usage warning: can't just test `if description:`
# lxml usage warning: can't just test `if description:`
Loading