diff --git a/brian_dashboard_manager/templating/helpers.py b/brian_dashboard_manager/templating/helpers.py index 2e0089a1b535152a7ad2924b81108b01e5299edd..6426eb71d86c0d0f5d29ecb6b3c836407c3ee010 100644 --- a/brian_dashboard_manager/templating/helpers.py +++ b/brian_dashboard_manager/templating/helpers.py @@ -231,11 +231,20 @@ def get_nren_interface_data(services, interfaces, excluded_dashboards): # MDVPN type services don't have data in BRIAN continue + has_v6_interface = False + for interface in _interfaces: + if 'addresses' in interface: + for address in interface['addresses']: + if address.find(':') > 0: + has_v6_interface = True + break + dashboard['SERVICES'].append({ 'measurement': measurement, 'title': title, 'scid': scid, - 'sort': (sid[:2], name) + 'sort': (sid[:2], name), + 'has_v6': has_v6_interface }) def _check_in_aggregate(router, interface): @@ -486,7 +495,7 @@ def get_panel_fields(panel, panel_type, datasource): }) -def default_interface_panel_generator(gridPos): +def default_interface_panel_generator(gridPos, ipv6_only=False): """ Helper for generating panel definitions for dashboards. @@ -494,6 +503,7 @@ def default_interface_panel_generator(gridPos): panel data and panel type. :param gridPos: generator for grid positions + :param ipv6_only: whether to use IPv6 traffic exclusively or not :return: function that generates panel definitions """ @@ -515,20 +525,29 @@ def default_interface_panel_generator(gridPos): result = [] for panel in panels: - result.append(get_panel_fields({ - **panel, - **next(gridPos) - }, 'traffic', datasource)) - if panel.get('has_v6', False): - result.append(get_panel_fields({ - **panel, - **next(gridPos) - }, 'IPv6', datasource)) - if errors: + if ipv6_only: + if panel.get('has_v6', False): + result.append(get_panel_fields({ + **panel, + **next(gridPos) + }, 'IPv6', datasource)) + else: + continue + else: result.append(get_panel_fields({ **panel, **next(gridPos) - }, 'errors', datasource)) + }, 'traffic', datasource)) + if panel.get('has_v6', False): + result.append(get_panel_fields({ + **panel, + **next(gridPos) + }, 'IPv6', datasource)) + if errors: + result.append(get_panel_fields({ + **panel, + **next(gridPos) + }, 'errors', datasource)) return result @@ -567,6 +586,7 @@ def get_nren_dashboard_data_single(data, datasource, tag): agg_panels = [] panel_gen = default_interface_panel_generator(gridPos) + panel_ipv6_gen = default_interface_panel_generator(gridPos, ipv6_only=True) services_dropdown = create_dropdown_panel('Services', **next(gridPos)) @@ -578,6 +598,12 @@ def get_nren_dashboard_data_single(data, datasource, tag): service_panels = panel_gen( sorted(dash['SERVICES'], key=sort_key), datasource) + + services_ipv6_dropdown = create_dropdown_panel('Services - IPv6 Only', **next(gridPos)) + service_ipv6_panels = panel_ipv6_gen( + sorted(dash['SERVICES'], key=sort_key), datasource + ) + iface_dropdown = create_dropdown_panel('Interfaces', **next(gridPos)) phys_panels = panel_gen(dash['PHYSICAL'], datasource, True) @@ -590,6 +616,10 @@ def get_nren_dashboard_data_single(data, datasource, tag): 'dropdown': services_dropdown, 'panels': service_panels, }, + { + 'dropdown': services_ipv6_dropdown, + 'panels': service_ipv6_panels + }, { 'dropdown': iface_dropdown, 'panels': phys_panels, @@ -769,7 +799,7 @@ def get_aggregate_dashboard_data(title, remotes, datasource, tag): ingress and one for egress. :param title: title for the dashboard - :param targets: dictionary of targets for the panels, the key is the + :param remotes: dictionary of targets for the panels, the key is the remote (usually a customer) and the value is a list of targets for that remote. A single target represents how to fetch data for one interface. diff --git a/tox.ini b/tox.ini index 191e414dfae410b640c79022e6cfeb016b0c2013..dc78bc46551ca55171192633bc42e0c3eaaa935f 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py36 +envlist = py38, py311 [flake8] exclude = venv,.tox