diff --git a/inventory_provider/routes/poller.py b/inventory_provider/routes/poller.py index 10c3345fd1b5e38caf95c571731eb594f3a8900d..39e940a25b43b03ff194857aeb49b772f2819441 100644 --- a/inventory_provider/routes/poller.py +++ b/inventory_provider/routes/poller.py @@ -30,6 +30,12 @@ These endpoints are intended for use by BRIAN. .. autofunction:: inventory_provider.routes.poller.gws_direct +/poller/gws/direct-config +--------------------------------- + +.. autofunction:: inventory_provider.routes.poller.gws_direct_config + + /poller/gws/indirect --------------------------------- @@ -53,13 +59,14 @@ support method: _get_dashboards .. autofunction:: inventory_provider.routes.poller._get_dashboards + """ from enum import Enum, auto import json import logging import re -from flask import Blueprint, Response, current_app, request +from flask import Blueprint, Response, current_app, request, jsonify from lxml import etree from inventory_provider import juniper @@ -1269,3 +1276,77 @@ def get_service_types(): redis.set(cache_key, service_types) return Response(service_types, mimetype='application/json') + + + +@routes.route("/gws/direct-config", methods=['GET', 'POST']) +def gws_direct_config(): + """ + Handler for `/poller/gws/direct-config` which returns + the basic gws-direct config. + + This api is only intended for config validation. + :return: + """ + + format = request.args.get('format', default='json', type=str) + format = format.lower() + if format not in ('html', 'json'): + return Response( + response='format must be one of: html, json', + status=400, + mimetype="text/html") + + def _counters(): + config_params = current_app.config['INVENTORY_PROVIDER_CONFIG'] + for nren_isp in config_params['gws-direct']: + for host in nren_isp['hosts']: + snmp_version = '2' if 'community' in host.keys() else '3' + for ifc in host['interfaces']: + for field, oid in ifc['counters'].items(): + yield { + 'nren': nren_isp['nren'], + 'isp': nren_isp['isp'], + 'hostname': host['hostname'], + 'snmp': snmp_version, + 'interface': ifc['tag'], + 'field': field, + 'oid': oid + } + + def _to_row(counter, header=False): + _columns = ( + 'nren', 'isp', 'hostname', 'snmp', 'interface', 'field', 'oid') + elems = ['<tr>'] + for name in _columns: + if header: + elems.append(f"<td>{counter['name']}</td>") + else: + elems.append(f'<th>{name}</th>') + elems.append('</tr>') + return ''.join(elems) + + if format == 'json': + if not request.accept_mimetypes.accept_json: + return Response( + response="response will be json", + status=406, + mimetype="text/html") + else: + return jsonify(list(_counters())) + + if not request.accept_mimetypes.accept_html: + return Response( + response="response will be html", + status=406, + mimetype="text/html") + + elems = ['<html>', '<body>', '<table>'] + elems.append(_to_row(None, header=True)) + elems += map(_to_row, _counters) + elems += ['</table>', '</body>', '</html>'] + + return Response( + response=''.join(elems), + status=200, + mimetype="text/html")