diff --git a/inventory_provider/routes/poller.py b/inventory_provider/routes/poller.py index 199047fd717cc022d9989914fe6d3c7a21a47328..ef6d352890064473feed8fa5ceb80d1042cd0ca8 100644 --- a/inventory_provider/routes/poller.py +++ b/inventory_provider/routes/poller.py @@ -75,6 +75,13 @@ routes = Blueprint('poller-support-routes', __name__) Gb = 1 << 30 +class INTERFACE_TYPES(Enum): + UNKNOWN = auto() + LOGICAL = auto() + PHYSICAL = auto() + AGGREGATE = auto() + + class BRIAN_DASHBOARDS(Enum): CLS = auto() RE_PEER = auto() @@ -106,6 +113,8 @@ class BRIAN_DASHBOARDS(Enum): # only used in INTERFACE_LIST_SCHEMA and sphinx docs _DASHBOARD_IDS = [d.name for d in list(BRIAN_DASHBOARDS)] +_INTERFACE_TYPES = [i.name for i in list(INTERFACE_TYPES)] + INTERFACE_LIST_SCHEMA = { '$schema': 'http://json-schema.org/draft-07/schema#', @@ -146,6 +155,13 @@ INTERFACE_LIST_SCHEMA = { 'dashboards': { 'type': 'array', 'items': {'enum': _DASHBOARD_IDS} + }, + 'dashboard_info': { + 'type': 'object', + 'properties': { + 'name': {'type': 'string'}, + 'interface_type': {'enum': _INTERFACE_TYPES} + } } }, 'required': [ @@ -374,7 +390,7 @@ def _get_dashboards(interface): yield BRIAN_DASHBOARDS.IAS_UPSTREAM if 'SRV_GLOBAL RE_INTERCONNECT' in description: yield BRIAN_DASHBOARDS.RE_PEER - if re.match('(PHY|LAG|SRV_GLOBAL) CUSTOMER', description): + if re.match(r'(PHY|LAG|SRV_GLOBAL) CUSTOMER', description): yield BRIAN_DASHBOARDS.RE_CUST if re.match('^SRV_GCS', description): yield BRIAN_DASHBOARDS.GCS @@ -405,6 +421,43 @@ def _get_dashboards(interface): yield BRIAN_DASHBOARDS.NREN +def _get_interface_type(interface): + description = interface.get('description', '').strip() + if re.match(r'^PHY', description): + return INTERFACE_TYPES.PHYSICAL + if re.match(r'^SRV_', description): + return INTERFACE_TYPES.LOGICAL + if re.match(r'^LAG', description): + return INTERFACE_TYPES.AGGREGATE + + return INTERFACE_TYPES.UNKNOWN + + +def _get_dashboard_data(ifc): + interface_type = _get_interface_type(ifc) + + description = ifc.get('description', '').strip() + dashboards = ifc.get('dashboards', []) + + if len(dashboards) == 0: + return ifc + + if BRIAN_DASHBOARDS.INFRASTRUCTURE_BACKBONE.name in dashboards: + name = description.split('|') + name = name[1].strip() + name = name.replace('( ', '(') + else: + name = description.split(' ')[2].upper() + + return { + **ifc, + 'dashboard_info': { + 'name': name, + 'interface_type': interface_type.name + } + } + + def _add_dashboards(interfaces): """ generator that dashboards to each interfaces. @@ -416,7 +469,7 @@ def _add_dashboards(interfaces): for ifc in interfaces: dashboards = _get_dashboards(ifc) ifc['dashboards'] = sorted([d.name for d in dashboards]) - yield ifc + yield _get_dashboard_data(ifc) def _load_interface_bundles(hostname=None): diff --git a/test/test_general_poller_routes.py b/test/test_general_poller_routes.py index 4e5e922621b916f86fd6057e2670daf551f234cc..7370c36cc0a2d1a1300e02f87f1c7a535a4d2e9d 100644 --- a/test/test_general_poller_routes.py +++ b/test/test_general_poller_routes.py @@ -254,3 +254,64 @@ def test_interface_dashboard_mapping(description, expected_dashboards): dashboards = poller._get_dashboards(interface) dashboards = [d.name for d in dashboards] assert set(list(dashboards)) == set(expected_dashboards) + + +@pytest.mark.parametrize('interface,dashboard_info', [ + ({ + 'description': 'SRV_IAS CUSTOMER JISC #JISC-AP1-IAS IASPS | ASN786', + 'dashboards': ['IAS_CUSTOMER', 'NREN'] + }, {'name': 'JISC', 'interface_type': 'LOGICAL'}), + ({ + 'description': 'SRV_L2CIRCUIT CUSTOMER JISC JISC #DUB-LON-NRENBBEXT-JANET-13015 | backup for niran ', # noqa: E501 + 'dashboards': ['L2_CIRCUIT'] + }, {'name': 'JISC', 'interface_type': 'LOGICAL'}), + ({ + 'description': 'SRV_L3VPN CUSTOMER EENET #EENET-AP2-LHCONE | ASN3221', + 'dashboards': ['LHCONE', 'LHCONE_CUST', 'NREN'] + }, {'name': 'EENET', 'interface_type': 'LOGICAL'}), + ({ + 'description': 'SRV_IAS PRIVATE OPTIMA-TELEKOM #HR-EduZone | For Eduzone', # noqa: E501 + 'dashboards': ['IAS_PEERS', 'IAS_PRIVATE'] + }, {'name': 'OPTIMA-TELEKOM', 'interface_type': 'LOGICAL'}), + ({ + 'description': 'SRV_CLS PRIVATE AWS #AT-AWS-CLS|ASN16509 | ', + 'dashboards': ['CLS', 'CLS_PEERS'] + }, {'name': 'AWS', 'interface_type': 'LOGICAL'}), + ({ + 'description': 'SRV_IAS PUBLIC MIX #IX_Peerings_in_MIX |', + 'dashboards': ['IAS_PEERS', 'IAS_PUBLIC'] + }, {'name': 'MIX', 'interface_type': 'LOGICAL'}), + ({ + 'description': 'LAG INFRASTRUCTURE BACKBONE SRF0000001 | bil-por', + 'dashboards': ['INFRASTRUCTURE_BACKBONE'] + }, {'name': 'bil-por', 'interface_type': 'AGGREGATE'}), + ({ + 'description': 'SRV_GCS CUSTOMER FCCN MICROSOFT #FCCN_NoveSBE_ExpressRoute_Vlan1945 | UNIT CONFIGURATION HAS BEEN SYSTEM GENERATED', # noqa: E501 + 'dashboards': ['GCS'] + }, {'name': 'FCCN', 'interface_type': 'LOGICAL'}), + ({ + 'description': 'PHY UPSTREAM TELIA SRF9940473 | Telia ID: IC-326863', + 'dashboards': ['GWS_PHY_UPSTREAM'] + }, {'name': 'TELIA', 'interface_type': 'PHYSICAL'}), + ({ + 'description': 'SRV_IAS UPSTREAM COGENT #COGENT_GWS_VIE | ASN174', + 'dashboards': ['IAS_UPSTREAM'] + }, {'name': 'COGENT', 'interface_type': 'LOGICAL'}), + ({ + 'description': 'SRV_L3VPN RE_INTERCONNECT CLARA #REDCLARA-LIS-LHCONE | ASN27750', # noqa: E501 + 'dashboards': ['LHCONE', 'LHCONE_PEER'] + }, {'name': 'CLARA', 'interface_type': 'LOGICAL'}), + ({ + 'description': 'SRV_MDVPN CUSTOMER REDIRIS #RedIRIS_AP1_BGP_LU_CoC_1 | MD VPN CoC-REDIRIS - ', # noqa: E501 + 'dashboards': ['MDVPN_CUSTOMERS', 'NREN'] + }, {'name': 'REDIRIS', 'interface_type': 'LOGICAL'}), + ({ + 'description': 'SRV_L2CIRCUIT CUSTOMER TENET PSNC #lon-lon-GEANTOPEN-PSNC-TENET-18067 |', # noqa: E501 + 'dashboards': ['GEANTOPEN', 'L2_CIRCUIT'] + }, {'name': 'TENET', 'interface_type': 'LOGICAL'}), +]) +def test_description_dashboard_parsing(interface, dashboard_info): + + updated = poller._get_dashboard_data(interface) + info = updated['dashboard_info'] + assert info == dashboard_info