Skip to content
Snippets Groups Projects
Commit 88aea809 authored by Erik Reid's avatar Erik Reid
Browse files

cache peer-info responses

parent 44dbc403
Branches
Tags
No related merge requests found
import ipaddress import ipaddress
import json import json
from flask import Blueprint, Response, jsonify from flask import Blueprint, Response
from inventory_provider.routes import common from inventory_provider.routes import common
...@@ -92,40 +92,50 @@ def find_interfaces(address): ...@@ -92,40 +92,50 @@ def find_interfaces(address):
@common.require_accepts_json @common.require_accepts_json
def peer_info(address): def peer_info(address):
try:
address_obj = ipaddress.ip_address(address)
except ValueError:
return Response(
response='unable to parse %r as an ip address' % address,
status=422,
mimetype="text/html")
r = common.get_redis() r = common.get_redis()
result = {} cache_key = 'classifier:peer-cache:%s' % address
info = r.get('ix_public_peer:%s' % address) result = r.get(cache_key)
if info: if result:
info = info.decode('utf-8') result = result.decode('utf-8')
result['ix-public-peer-info'] = json.loads(info) else:
description = result['ix-public-peer-info']['description'] try:
assert description is not None # sanity address_obj = ipaddress.ip_address(address)
result['ix-public-peer-group'] = list( except ValueError:
ix_peering_group(address_obj, description)) return Response(
response='unable to parse %r as an ip address' % address,
info = r.get('vpn_rr_peer:%s' % address) status=422,
if info: mimetype="text/html")
info = info.decode('utf-8')
result['vpn-rr-peer-info'] = json.loads(info) result = {}
interfaces = list(find_interfaces(address_obj)) info = r.get('ix_public_peer:%s' % address)
if interfaces: if info:
result['interfaces'] = interfaces info = info.decode('utf-8')
result['ix-public-peer-info'] = json.loads(info)
if not result: description = result['ix-public-peer-info']['description']
return Response( assert description is not None # sanity
response='no peering info found for %s' % address, result['ix-public-peer-group'] = list(
status=404, ix_peering_group(address_obj, description))
mimetype="text/html")
info = r.get('vpn_rr_peer:%s' % address)
return jsonify(result) if info:
info = info.decode('utf-8')
result['vpn-rr-peer-info'] = json.loads(info)
interfaces = list(find_interfaces(address_obj))
if interfaces:
result['interfaces'] = interfaces
if not result:
return Response(
response='no peering info found for %s' % address,
status=404,
mimetype="text/html")
result = json.dumps(result)
# cache this data for the next call
r.set(cache_key, result.encode('utf-8'))
return Response(result, mimetype="application/json")
...@@ -260,6 +260,7 @@ def clear_cached_classifier_responses(hostname): ...@@ -260,6 +260,7 @@ def clear_cached_classifier_responses(hostname):
r = get_redis(InventoryTask.config) r = get_redis(InventoryTask.config)
for k in r.keys('classifier:cache:%s:*' % hostname): for k in r.keys('classifier:cache:%s:*' % hostname):
r.delete(k) r.delete(k)
# TODO: remove peer-cache (after adding hostname to query)
def _refresh_peers(hostname, key_base, peers): def _refresh_peers(hostname, key_base, peers):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment