import requests import logging from functools import reduce logger = logging.getLogger(__name__) def _get_ip_info(host): # pragma: no cover def reduce_func(prev, curr): interface_name = curr.get('name') router_name = curr.get('router') if interface_name and router_name: router = prev.get(router_name, {}) interface = router.get(interface_name, {}) ipv4 = curr.get('ipv4', []) ipv6 = curr.get('ipv6', []) interface['ipv4'] = ipv4 interface['ipv6'] = ipv6 router[interface_name] = interface prev[router_name] = router return prev r = requests.get(f'{host}/data/interfaces') r.raise_for_status() interfaces = r.json() return reduce(reduce_func, interfaces, {}) def get_interfaces(host): # pragma: no cover r = requests.get(f'{host}/poller/interfaces') r.raise_for_status() interfaces = r.json() ip_info = _get_ip_info(host) def enrich(interface): router_name = interface.get('router') router = ip_info.get(router_name) if not router: return interface ip = router.get(interface['name']) ipv4 = ip['ipv4'] ipv6 = ip['ipv6'] interface['ipv4'] = ipv4 interface['ipv6'] = ipv6 return interface enriched = list(map(enrich, interfaces)) return enriched def get_gws_direct(host): r = requests.get(f'{host}/poller/gws/direct') r.raise_for_status() interfaces = r.json() return interfaces