Skip to content
Snippets Groups Projects
Commit 1dff1cc8 authored by Neda Moeini's avatar Neda Moeini
Browse files

Support ASN dot notation.

parent dc15e2f5
Branches
Tags
1 merge request!18Support ASN dot notation.
...@@ -243,6 +243,23 @@ def list_interfaces(netconf_config): ...@@ -243,6 +243,23 @@ 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.
"""
if '.' in asn_string:
high_order, low_order = map(int, asn_string.split('.'))
return (high_order << 16) | low_order
else:
return int(asn_string)
def _system_bgp_peers(system_node): def _system_bgp_peers(system_node):
def _peering_params(neighbor_node): def _peering_params(neighbor_node):
...@@ -251,11 +268,11 @@ def _system_bgp_peers(system_node): ...@@ -251,11 +268,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:`
......
...@@ -5,6 +5,7 @@ import ipaddress ...@@ -5,6 +5,7 @@ import ipaddress
import pytest import pytest
from inventory_provider import juniper from inventory_provider import juniper
from inventory_provider.juniper import asn_to_int
NETIFACES_TEST_DATA_STRING = """{ NETIFACES_TEST_DATA_STRING = """{
'lo0': {{AF_INET}: [{'addr': '127.0.0.1', 'netmask': '255.0.0.0', 'peer': '127.0.0.1'}], 'lo0': {{AF_INET}: [{'addr': '127.0.0.1', 'netmask': '255.0.0.0', 'peer': '127.0.0.1'}],
...@@ -70,3 +71,17 @@ def test_local_v6_interfaces(mocked_netifaces): ...@@ -70,3 +71,17 @@ def test_local_v6_interfaces(mocked_netifaces):
assert len(addresses) == 4 assert len(addresses) == 4
for a in addresses: for a in addresses:
assert isinstance(a, ipaddress.IPv6Interface) assert isinstance(a, ipaddress.IPv6Interface)
def test_asn_to_int_functionality():
"""Test that ASN to int conversion works with and without dot notation."""
# Test with dot notation
assert asn_to_int("1.1") == 65537
assert asn_to_int("64512.2") == 4227858434
assert asn_to_int("0.65535") == 65535
# Test without dot notation
assert asn_to_int("65537") == 65537
assert asn_to_int("0") == 0
assert asn_to_int("4227858434") == 4227858434
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment