From af7c71b8a55965974d45aa5eb00d29af1541b79d Mon Sep 17 00:00:00 2001 From: Erik Reid <erik.reid@geant.org> Date: Mon, 2 Aug 2021 18:43:47 +0200 Subject: [PATCH] added dashboards to interfaces response --- inventory_provider/routes/poller.py | 99 ++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 2 deletions(-) diff --git a/inventory_provider/routes/poller.py b/inventory_provider/routes/poller.py index 9561ce47..70a69946 100644 --- a/inventory_provider/routes/poller.py +++ b/inventory_provider/routes/poller.py @@ -49,6 +49,7 @@ These endpoints are intended for use by BRIAN. """ +from enum import Enum, auto import json import logging import re @@ -68,6 +69,32 @@ routes = Blueprint('poller-support-routes', __name__) Gb = 1 << 30 + +class BRIAN_DASHBOARDS(Enum): + CLS = auto() + RE_PEER = auto() + RE_CUST = auto() + GEANTOPEN = auto() + GCS = auto() + L2_CIRCUIT = auto() + LHCONE_PEER = auto() + LHCONE_CUST = auto() + MDVPN_CUSTOMERS = auto() + INFRASTRUCTURE_BACKBONE = auto() + IAS_PRIVATE = auto() + IAS_PUBLIC = auto() + IAS_CUSTOMER = auto() + IAS_UPSTREAM = auto() + GWS_PHY_UPSTREAM = auto() + + # aggregate dashboards + CLS_PEERS = auto() + IAS_PEERS = auto() + GWS_UPSTREAMS = auto() + LHCONE = auto() + CAE1 = auto() + + INTERFACE_LIST_SCHEMA = { '$schema': 'http://json-schema.org/draft-07/schema#', @@ -296,6 +323,69 @@ def after_request(resp): return common.after_request(resp) +def _get_dashboards(interface): + + router = interface.get('router', '').lower() + ifc_name = interface.get('name', '') + description = interface.get('description', '').strip() + + if 'SRV_CLS' in description: + yield BRIAN_DASHBOARDS.CLS + if 'SRV_CLS PRIVATE' in description: + yield BRIAN_DASHBOARDS.CLS_PEERS + if 'SRV_IAS PUBLIC' in description: + yield BRIAN_DASHBOARDS.IAS_PUBLIC + yield BRIAN_DASHBOARDS.IAS_PEERS + if 'SRV_IAS PRIVATE' in description: + yield BRIAN_DASHBOARDS.IAS_PRIVATE + yield BRIAN_DASHBOARDS.IAS_PEERS + if 'SRV_IAS CUSTOMER' in description: + yield BRIAN_DASHBOARDS.IAS_CUSTOMER + if 'SRV_IAS UPSTREAM' in description: + 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): + yield BRIAN_DASHBOARDS.RE_CUST + if re.match('^SRV_GCS', description): + yield BRIAN_DASHBOARDS.GCS + if 'GEANTOPEN' in description: + yield BRIAN_DASHBOARDS.GEANTOPEN + if 'SRV_L2CIRCUIT' in description: + yield BRIAN_DASHBOARDS.L2_CIRCUIT + if 'LHCONE' in description: + if 'SRV_L3VPN RE' in description: + yield BRIAN_DASHBOARDS.LHCONE_PEER + if 'SRV_L3VPN CUSTOMER' in description: + yield BRIAN_DASHBOARDS.LHCONE_CUST + if re.match('SRV_L3VPN (CUSTOMER|RE_INTERCONNECT)', description): + yield BRIAN_DASHBOARDS.LHCONE + if re.match('^SRV_MDVPN CUSTOMER', description): + yield BRIAN_DASHBOARDS.MDVPN_CUSTOMERS + if 'LAG' in description and \ + re.match('(SRV_GLOBAL|LAG|PHY) INFRASTRUCTURE BACKBONE', + description): + yield BRIAN_DASHBOARDS.INFRASTRUCTURE_BACKBONE + if router == 'mx1.lon.uk.geant.net' \ + and re.match(r'^ae12(\.\d+|$)$', ifc_name): + yield BRIAN_DASHBOARDS.CAE1 + if re.match('^PHY UPSTREAM', description): + yield BRIAN_DASHBOARDS.GWS_PHY_UPSTREAM + + +def _add_dashboards(interfaces): + """ + generator that dashboards to each interfaces. + + :param interfaces: result of _load_interfaces + :return: generator with `dashboards` populated in each element + """ + + for ifc in interfaces: + ifc['dashboards'] = sorted(list(_get_dashboards(ifc))) + yield ifc + + def _load_interface_bundles(hostname=None): result = dict() @@ -476,15 +566,20 @@ def _load_interfaces_to_poll(hostname=None): :return: generator yielding interface elements """ basic_interfaces = _load_interfaces(hostname) + # basic_interfaces = list(basic_interfaces) with_bundles = _add_bundle_parents(basic_interfaces, hostname) with_circuits = _add_circuits(with_bundles, hostname) + # with_circuits = list(with_circuits) with_snmp = _add_snmp_indexes(with_circuits, hostname) + # with_snmp = list(with_snmp) + # only return interfaces that can be polled def _has_snmp_index(ifc): return 'snmp-index' in ifc - # only return interfaces that can be polled - return filter(_has_snmp_index, with_snmp) + to_poll = filter(_has_snmp_index, with_snmp) + + return _add_dashboards(to_poll) @routes.route("/interfaces", methods=['GET', 'POST']) -- GitLab