From 68440b99bdc75d3b456ebdcbf2e871387b57dfba Mon Sep 17 00:00:00 2001
From: Erik Reid <erik.reid@geant.org>
Date: Mon, 16 Aug 2021 17:31:39 +0200
Subject: [PATCH] draft /poller/gws/direct-config
---
inventory_provider/routes/poller.py | 83 ++++++++++++++++++++++++++++-
1 file changed, 82 insertions(+), 1 deletion(-)
diff --git a/inventory_provider/routes/poller.py b/inventory_provider/routes/poller.py
index 10c3345f..39e940a2 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")
--
GitLab