From d0f6e569304efd0a98ca6810b5f26e4f0293112b Mon Sep 17 00:00:00 2001 From: Morten Linderud Date: Sun, 1 Dec 2019 13:42:12 +0100 Subject: [templating] Fixup connection errors and timeout --- templating/templating.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) (limited to 'templating/templating.py') diff --git a/templating/templating.py b/templating/templating.py index 87853b6..140745f 100755 --- a/templating/templating.py +++ b/templating/templating.py @@ -8,7 +8,7 @@ import netaddr import requests from flask import Flask, request -from jinja2 import Environment, FileSystemLoader, TemplateNotFound +from jinja2 import Environment, FileSystemLoader, TemplateNotFound, TemplateError endpoints = "read/networks read/oplog read/snmp read/switches-management public/distro-tree public/config public/dhcp public/dhcp-summary public/ping public/switches public/switch-state".split() @@ -16,9 +16,12 @@ objects = {} def getEndpoint(endpoint): - r = requests.get("http://localhost:80/api/{}".format(endpoint)) - if r.status_code != 200: - raise Exception("Bad status code for endpoint {}: {}".format(endpoint, r.status_code)) + uri = "{}/api/{}".format(args.server, endpoint) + try: + r = requests.get(uri, timeout=args.timeout) + except (requests.exceptions.ConnectTimeout, requests.exceptions.ConnectionError): + raise Exception("Couldn't connect to server {}".format(uri)) + r.raise_for_status() return r.json() @@ -52,14 +55,18 @@ def add_header(response): @app.route("/", methods=["GET"]) def root_get(path): - updateData() try: + updateData() template = env.get_template(path) body = template.render(objects=objects, options=request.args) except TemplateNotFound: return 'Template "{}" not found\n'.format(path), 404 - except Exception as err: + except TemplateError as err: return 'Templating of "{}" failed to render. Most likely due to an error in the template. Error transcript:\n\n{}\n----\n\n{}\n'.format(path, err, traceback.format_exc()), 400 + except requests.exceptions.HTTPError as err: + return 'HTTP error from gondul: {}'.format(err), 500 + except Exception as err: + return 'Connection issues: {}'.format(err), 500 return body, 200 @@ -80,6 +87,8 @@ parser.add_argument("-t", "--templates", type=str, nargs="+", help="location of parser.add_argument("-h", "--host", type=str, default="127.0.0.1", help="host address") parser.add_argument("-p", "--port", type=int, default=8080, help="host port") parser.add_argument("-d", "--debug", action="store_true", help="enable debug mode") +parser.add_argument("-s", "--server", type=str, default="http://localhost:80", help="gondul server address") +parser.add_argument("-x", "--timeout", type=int, default=1, help="gondul server timeout") args = parser.parse_args() env.loader.searchpath = args.templates -- cgit v1.2.3 From 920fa648837152255c0937b03ec373c13830da42 Mon Sep 17 00:00:00 2001 From: slinderud Date: Tue, 3 Dec 2019 20:23:36 +0100 Subject: Template: bugfixes on templating.py. Added test template that uses API and created a readme --- templating/templating.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'templating/templating.py') diff --git a/templating/templating.py b/templating/templating.py index 140745f..603b370 100755 --- a/templating/templating.py +++ b/templating/templating.py @@ -88,12 +88,13 @@ parser.add_argument("-h", "--host", type=str, default="127.0.0.1", help="host ad parser.add_argument("-p", "--port", type=int, default=8080, help="host port") parser.add_argument("-d", "--debug", action="store_true", help="enable debug mode") parser.add_argument("-s", "--server", type=str, default="http://localhost:80", help="gondul server address") -parser.add_argument("-x", "--timeout", type=int, default=1, help="gondul server timeout") +parser.add_argument("-x", "--timeout", type=int, default=2, help="gondul server timeout") args = parser.parse_args() env.loader.searchpath = args.templates if not sys.argv[1:]: parser.print_help() + sys.exit(1) app.run(host=args.host, port=args.port, debug=args.debug) -- cgit v1.2.3 From e9fdb3ff6b6356ba8acbf76781517d3e511cddca Mon Sep 17 00:00:00 2001 From: slinderud Date: Sun, 8 Dec 2019 13:38:13 +0100 Subject: templating: fixes based on PR feedback --- templating/templating.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) (limited to 'templating/templating.py') diff --git a/templating/templating.py b/templating/templating.py index 603b370..55bb3f5 100755 --- a/templating/templating.py +++ b/templating/templating.py @@ -10,21 +10,24 @@ import requests from flask import Flask, request from jinja2 import Environment, FileSystemLoader, TemplateNotFound, TemplateError -endpoints = "read/networks read/oplog read/snmp read/switches-management public/distro-tree public/config public/dhcp public/dhcp-summary public/ping public/switches public/switch-state".split() +endpoints = ["read/networks", "read/oplog", "read/snmp", "read/switches-management", "public/distro-tree", + "public/config", "public/dhcp", "public/dhcp-summary", "public/ping", "public/switches", + "public/switch-state"] objects = {} -def getEndpoint(endpoint): - uri = "{}/api/{}".format(args.server, endpoint) - try: - r = requests.get(uri, timeout=args.timeout) - except (requests.exceptions.ConnectTimeout, requests.exceptions.ConnectionError): - raise Exception("Couldn't connect to server {}".format(uri)) + + +def getEndpoint(endpoint: str) -> dict: + """ + Fetches an endpoint and returns the data as a dict. + """ + uri = f"{args.server}/api/{endpoint}" + r = requests.get(uri, timeout=args.timeout) r.raise_for_status() return r.json() - def updateData(): for a in endpoints: objects[a] = getEndpoint(a) @@ -59,14 +62,16 @@ def root_get(path): updateData() template = env.get_template(path) body = template.render(objects=objects, options=request.args) + except (requests.exceptions.ConnectTimeout, requests.exceptions.ConnectionError) as error: + return f'Timeout or connection error from gondul: {err}', 500 except TemplateNotFound: - return 'Template "{}" not found\n'.format(path), 404 + return f'Template "{path}" not found\n', 404 except TemplateError as err: - return 'Templating of "{}" failed to render. Most likely due to an error in the template. Error transcript:\n\n{}\n----\n\n{}\n'.format(path, err, traceback.format_exc()), 400 + return f'Templating of "{path}" failed to render. Most likely due to an error in the template. Error transcript:\n\n{err}\n----\n\n{traceback.format_exc()}\n', 400 except requests.exceptions.HTTPError as err: - return 'HTTP error from gondul: {}'.format(err), 500 + return f'HTTP error from gondul: {err}', 500 except Exception as err: - return 'Connection issues: {}'.format(err), 500 + return f'Uncaight error: {err}', 500 return body, 200 @@ -78,7 +83,7 @@ def root_post(path): template = env.from_string(content.decode("utf-8")) body = template.render(objects=objects, options=request.args) except Exception as err: - return 'Templating of "{}" failed to render. Most likely due to an error in the template. Error transcript:\n\n{}\n----\n\n{}\n'.format(path, err, traceback.format_exc()), 400 + return 'Templating of "{path}" failed to render. Most likely due to an error in the template. Error transcript:\n\n{err}\n----\n\n{traceback.format_exc()}\n', 400 return body, 200 -- cgit v1.2.3 From e3f94592109a476426b6c2945c4a8a8943f572ad Mon Sep 17 00:00:00 2001 From: slinderud Date: Sun, 8 Dec 2019 13:39:31 +0100 Subject: templating: spelling is hard --- templating/templating.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'templating/templating.py') diff --git a/templating/templating.py b/templating/templating.py index 55bb3f5..1eff4a3 100755 --- a/templating/templating.py +++ b/templating/templating.py @@ -71,7 +71,7 @@ def root_get(path): except requests.exceptions.HTTPError as err: return f'HTTP error from gondul: {err}', 500 except Exception as err: - return f'Uncaight error: {err}', 500 + return f'Uncaught error: {err}', 500 return body, 200 -- cgit v1.2.3