Skip to content
Snippets Groups Projects
eumetsat.py 2.71 KiB
Newer Older
import operator
from brian_dashboard_manager.templating.helpers \
    import get_dashboard_data, letter_generator, create_panel


def get_panel_data(all_subscriptions):

    result = dict()

    def _panel(s):
        return {
Erik Reid's avatar
Erik Reid committed
            'measurement': 'multicast_rates',
            'title': f'{s["subscription"]} on {s["router"]}',
            'subscription': s['subscription'],
Erik Reid's avatar
Erik Reid committed
            'hostname': s['router']
        }

    for subscription in all_subscriptions:
        dashboard_name = f'{subscription["router"]} subscriptions'
        result.setdefault(dashboard_name, []).append(_panel(subscription))

    # make the panels sorted deterministically
    for name in result.keys():
Erik Reid's avatar
Erik Reid committed
        result[name] = sorted(
            result[name],
            key=operator.itemgetter('subscription'))

    return result


def get_panel_fields(panel, panel_type, datasource):
    """
Erik Reid's avatar
Erik Reid committed
    Helper for generating a single multicast panel
    """
    letters = letter_generator()

    def get_target_data(alias, field):
        return {
            # panel includes identifying information
            # such as hostname, subscription, etc.
            **panel,
            'alias': alias,
            'refId': next(letters),
            'select_field': field
            # 'percentile': 'percentile' in alias.lower(),
        }

    targets = [('Multicast Traffic', 'octets')]

    return create_panel({
        **panel,
        'datasource': datasource,
        'linewidth': 1,
        'title': panel['title'].format(panel_type),
        'panel_targets': [get_target_data(*target) for target in targets],
        'y_axis_type': 'bits',
    })

Erik Reid's avatar
Erik Reid committed

def subscription_panel_generator(gridPos):
    """
Erik Reid's avatar
Erik Reid committed
    Generates panels used for multicast traffic dashboards
    """
    def get_panel_definitions(panels, datasource, errors=False):
        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:
                result.append(get_panel_fields({
                    **panel,
                    **next(gridPos)
                }, 'errors', datasource))

        return result

    return get_panel_definitions


def generate_eumetsat_multicast(subscriptions, datasource):
    panel_data = get_panel_data(subscriptions)
    for dash in get_dashboard_data(
            data=panel_data,
            datasource=datasource,
            tag='EUMET_MULTICAST',
            panel_generator=subscription_panel_generator):

        yield dash