From 1708c1b3a2d08c4ecd7e30e83b2b70b64db38e8e Mon Sep 17 00:00:00 2001
From: Robert Latta <robert.latta@geant.org>
Date: Fri, 26 Mar 2021 17:09:59 +0000
Subject: [PATCH] added ignore-cache to all routes that cache data

---
 inventory_provider/routes/classifier.py | 74 ++++---------------------
 inventory_provider/routes/common.py     | 19 +++++++
 inventory_provider/routes/data.py       | 10 ++--
 inventory_provider/routes/lg.py         | 10 ++--
 inventory_provider/routes/msr.py        | 22 +++-----
 inventory_provider/routes/poller.py     | 17 +++---
 6 files changed, 57 insertions(+), 95 deletions(-)

diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py
index 6dcb9e42..c2615758 100644
--- a/inventory_provider/routes/classifier.py
+++ b/inventory_provider/routes/classifier.py
@@ -2,13 +2,13 @@ import ipaddress
 import json
 import logging
 import re
-from distutils.util import strtobool
 from typing import Optional
 
 from flask import Blueprint, Response, request
 from redis import Redis
 
 from inventory_provider.routes import common
+from inventory_provider.routes.common import _ignore_cache_or_retrieve
 
 routes = Blueprint("inventory-data-classifier-support-routes", __name__)
 
@@ -261,19 +261,9 @@ def get_juniper_link_info(source_equipment: str, interface: str) -> Response:
     cache_key = \
         f'classifier-cache:juniper:{ims_source_equipment}:{ims_interface}'
 
-    ignore_cache = request.args.get('ignore-cache', default='false', type=str)
-    try:
-        ignore_cache = strtobool(ignore_cache)
-    except ValueError:
-        ignore_cache = False
-    if ignore_cache:
-        result = False
-    else:
-        result = r.get(cache_key)
+    result = _ignore_cache_or_retrieve(request, cache_key, r)
 
-    if result:
-        result = result.decode('utf-8')
-    else:
+    if not result:
         result = {
             'interface': _link_interface_info(r, source_equipment, interface)
         }
@@ -522,21 +512,9 @@ def peer_info(address_str: str) -> Response:
     r = common.get_current_redis()
 
     cache_key = f'classifier-cache:peer:{address_str}'
+    result = _ignore_cache_or_retrieve(request, cache_key, r)
 
-    ignore_cache = request.args.get('ignore-cache', default='false', type=str)
-    try:
-        ignore_cache = strtobool(ignore_cache)
-    except ValueError:
-        ignore_cache = False
-    if ignore_cache:
-        result = False
-    else:
-        result = r.get(cache_key)
-
-    if result:
-        result = result.decode('utf-8')
-    else:
-
+    if not result:
         result = {
             'interfaces': [],
             'locations': [],
@@ -626,19 +604,9 @@ def get_trap_metadata(source_equipment: str, interface: str, circuit_id: str) \
 
     r = common.get_current_redis()
 
-    ignore_cache = request.args.get('ignore-cache', default='false', type=str)
-    try:
-        ignore_cache = strtobool(ignore_cache)
-    except ValueError:
-        ignore_cache = False
-    if ignore_cache:
-        result = False
-    else:
-        result = r.get(cache_key)
+    result = _ignore_cache_or_retrieve(request, cache_key, r)
 
-    if result:
-        result = result.decode('utf-8')
-    else:
+    if not result:
         result = {
             'locations': []
         }
@@ -693,19 +661,9 @@ def get_fiberlink_trap_metadata(ne_name_str: str, object_name_str: str) \
     cache_key = \
         f'classifier-cache:fiberlink:{ne_name_str}:{object_name_str}'
 
-    ignore_cache = request.args.get('ignore-cache', default='false', type=str)
-    try:
-        ignore_cache = strtobool(ignore_cache)
-    except ValueError:
-        ignore_cache = False
-    if ignore_cache:
-        result = False
-    else:
-        result = r.get(cache_key)
+    result = _ignore_cache_or_retrieve(request, cache_key, r)
 
-    if result:
-        result = result.decode('utf-8')
-    else:
+    if not result:
         equipment_a = matches[0][0]
         equipment_b = matches[1][0]
         interface_a = interfaces[0]
@@ -828,19 +786,9 @@ def get_coriant_info(equipment_name: str, entity_string: str) -> Response:
     cache_key = 'classifier-cache:coriant:' \
                 f'{ims_source_equipment}:{ims_interface}'
 
-    ignore_cache = request.args.get('ignore-cache', default='false', type=str)
-    try:
-        ignore_cache = strtobool(ignore_cache)
-    except ValueError:
-        ignore_cache = False
-    if ignore_cache:
-        result = False
-    else:
-        result = r.get(cache_key)
+    result = _ignore_cache_or_retrieve(request, cache_key, r)
 
-    if result:
-        result = result.decode('utf-8')
-    else:
+    if not result:
 
         m = re.match(r'^(\d+\-\d+)\.(\d+)', ims_interface)
         if not m:
diff --git a/inventory_provider/routes/common.py b/inventory_provider/routes/common.py
index b9801d64..af20bf9a 100644
--- a/inventory_provider/routes/common.py
+++ b/inventory_provider/routes/common.py
@@ -6,6 +6,7 @@ import queue
 import random
 import threading
 
+from distutils.util import strtobool
 from lxml import etree
 import requests
 from flask import request, Response, current_app, g
@@ -16,6 +17,24 @@ _DECODE_TYPE_XML = 'xml'
 _DECODE_TYPE_JSON = 'json'
 
 
+def _ignore_cache_or_retrieve(request_, cache_key, r):
+
+    ignore_cache = request_.args.get('ignore-cache', default='false', type=str)
+    try:
+        ignore_cache = strtobool(ignore_cache)
+    except ValueError:
+        ignore_cache = False
+    if ignore_cache:
+        result = False
+        logger.debug('ignoring cache')
+    else:
+        result = r.get(cache_key)
+
+    if result:
+        result = result.decode('utf-8')
+    return result
+
+
 def ims_hostname_decorator(field):
     """
     Decorator to convert host names to various formats to try to match what is
diff --git a/inventory_provider/routes/data.py b/inventory_provider/routes/data.py
index b8d9c59c..275d7a1a 100644
--- a/inventory_provider/routes/data.py
+++ b/inventory_provider/routes/data.py
@@ -2,9 +2,10 @@ import json
 import logging
 import re
 
-from flask import Blueprint, jsonify, Response, current_app
+from flask import Blueprint, jsonify, Response, current_app, request
 
 from inventory_provider.routes import common
+from inventory_provider.routes.common import _ignore_cache_or_retrieve
 
 logger = logging.getLogger(__name__)
 
@@ -139,11 +140,10 @@ def router_interfaces(hostname=None):
         if hostname else 'classifier-cache:netconf-interfaces:all'
 
     r = common.get_current_redis()
-    result = r.get(cache_key)
-    if result:
-        result = result.decode('utf-8')
 
-    else:
+    result = _ignore_cache_or_retrieve(request, cache_key, r)
+
+    if not result:
         key_pattern = f'netconf-interfaces:{hostname}:*' \
             if hostname else 'netconf-interfaces:*'
         config = current_app.config['INVENTORY_PROVIDER_CONFIG']
diff --git a/inventory_provider/routes/lg.py b/inventory_provider/routes/lg.py
index b30ddc03..c615aa7d 100644
--- a/inventory_provider/routes/lg.py
+++ b/inventory_provider/routes/lg.py
@@ -1,9 +1,10 @@
 import json
 import logging
 
-from flask import Blueprint, jsonify, Response
+from flask import Blueprint, jsonify, Response, request
 
 from inventory_provider.routes import common
+from inventory_provider.routes.common import _ignore_cache_or_retrieve
 
 logger = logging.getLogger(__name__)
 
@@ -107,11 +108,10 @@ def routers(access):
                 yield rtr
 
     cache_key = f'classifier-cache:ims-lg:{access}'
-    result = redis.get(cache_key)
 
-    if result:
-        result = json.loads(result.decode('utf-8'))
-    else:
+    result = _ignore_cache_or_retrieve(request, cache_key, redis)
+
+    if not result:
         result = list(_routers())
         # cache this data for the next call
         redis.set(cache_key, json.dumps(result).encode('utf-8'))
diff --git a/inventory_provider/routes/msr.py b/inventory_provider/routes/msr.py
index cead3b83..f168845d 100644
--- a/inventory_provider/routes/msr.py
+++ b/inventory_provider/routes/msr.py
@@ -1,9 +1,10 @@
 import itertools
 import json
 
-from flask import Blueprint, jsonify, Response
+from flask import Blueprint, jsonify, Response, request
 
 from inventory_provider.routes import common
+from inventory_provider.routes.common import _ignore_cache_or_retrieve
 
 routes = Blueprint("msr-query-routes", __name__)
 
@@ -104,11 +105,10 @@ def access_services():
             yield json.loads(service)
 
     cache_key = 'classifier-cache:msr:access-services'
-    result = redis.get(cache_key)
 
-    if result:
-        result = json.loads(result.decode('utf-8'))
-    else:
+    result = _ignore_cache_or_retrieve(request, cache_key, redis)
+
+    if not result:
         result = list(_services())
         # cache this data for the next call
         redis.set(cache_key, json.dumps(result).encode('utf-8'))
@@ -159,11 +159,9 @@ def _handle_peering_group_request(name, cache_key, group_key_base):
     if name:
         cache_key = f'{cache_key}:{name}'
 
-    items = r.get(cache_key)
+    items = _ignore_cache_or_retrieve(request, cache_key, r)
 
-    if items:
-        items = json.loads(items.decode('utf-8'))
-    else:
+    if not items:
         if name:
             items = _load_list_items(f'{group_key_base}:{name}')
         else:
@@ -265,11 +263,9 @@ def _handle_peering_group_list_request(cache_key, group_key_base):
             k = k.decode('utf-8')
             yield k[len(group_key_base) + 1:]
 
-    names = r.get(cache_key)
+    names = _ignore_cache_or_retrieve(request, cache_key, r)
 
-    if names:
-        names = json.loads(names.decode('utf-8'))
-    else:
+    if not names:
         names = list(_get_all_subkeys())
         if not names:
             return Response(
diff --git a/inventory_provider/routes/poller.py b/inventory_provider/routes/poller.py
index 6d516d8b..ae6fd03b 100644
--- a/inventory_provider/routes/poller.py
+++ b/inventory_provider/routes/poller.py
@@ -2,11 +2,12 @@ import json
 import logging
 import re
 
-from flask import Blueprint, Response, current_app
+from flask import Blueprint, Response, current_app, request
 from inventory_provider import juniper
 from inventory_provider.routes import common
 from inventory_provider.routes.classifier import get_ims_equipment_name, \
     get_ims_interface
+from inventory_provider.routes.common import _ignore_cache_or_retrieve
 
 logger = logging.getLogger(__name__)
 routes = Blueprint('poller-support-routes', __name__)
@@ -291,10 +292,9 @@ def interfaces(hostname=None):
 
     r = common.get_current_redis()
 
-    result = r.get(cache_key)
-    if result:
-        result = result.decode('utf-8')
-    else:
+    result = _ignore_cache_or_retrieve(request, cache_key, r)
+
+    if not result:
         result = list(_load_interfaces_to_poll(hostname))
         if not result:
             return Response(
@@ -387,10 +387,9 @@ def interface_speeds(hostname=None):
 
     r = common.get_current_redis()
 
-    result = r.get(cache_key)
-    if result:
-        result = result.decode('utf-8')
-    else:
+    result = _ignore_cache_or_retrieve(request, cache_key, r)
+
+    if not result:
         result = list(_load_interfaces_and_speeds(hostname))
         if not result:
             return Response(
-- 
GitLab