From 2c3a49d866ebd62210f2fbcd3a1681e58f794efa Mon Sep 17 00:00:00 2001 From: Bin Yang Date: Mon, 26 Nov 2018 13:10:30 +0000 Subject: Cache AAI data Add profiler decorator Change-Id: I280b5799fa876d881dc2331b44dd34344437eba3 Issue-ID: MULTICLOUD-417 Signed-off-by: Bin Yang --- share/common/msapi/extsys.py | 9 +++++++++ share/newton_base/util.py | 30 ++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/share/common/msapi/extsys.py b/share/common/msapi/extsys.py index e1534523..9b65072e 100644 --- a/share/common/msapi/extsys.py +++ b/share/common/msapi/extsys.py @@ -12,6 +12,7 @@ import json import logging import re +from django.core.cache import cache from common.exceptions import VimDriverNewtonException from common.utils import restcall @@ -22,6 +23,12 @@ logger = logging.getLogger(__name__) def get_vim_by_id(vim_id): + # try to load from cache + cachedviminfostr = cache.get("VIMINFOCACHE_"+vim_id) + if cachedviminfostr: + viminfo = json.loads(cachedviminfostr) + return viminfo + cloud_owner,cloud_region_id = decode_vim_id(vim_id) if cloud_owner and cloud_region_id: @@ -74,6 +81,8 @@ def get_vim_by_id(vim_id): viminfo['openstack_region_id'] = tmp_viminfo.get("cloud-epa-caps") \ if tmp_viminfo.get("cloud-epa-caps") else cloud_region_id + # cache the viminfo for 24 hour + cache.set("VIMINFOCACHE_"+vim_id, json.dumps(viminfo), 3600*24) return viminfo return None diff --git a/share/newton_base/util.py b/share/newton_base/util.py index e925d99a..aa03b65b 100644 --- a/share/newton_base/util.py +++ b/share/newton_base/util.py @@ -22,6 +22,11 @@ from keystoneauth1 import session from common.msapi import extsys +# profiler decoration +import cProfile +import pstats +import os + logger = logging.getLogger(__name__) @@ -147,3 +152,28 @@ class VimDriverUtils(object): def replace_key_by_mapping(dict_obj, mapping, reverse=False): for k in mapping: VimDriverUtils._replace_a_key(dict_obj, k, reverse) + + # profiler decoration + @staticmethod + def do_cprofile(filename): + """ + Decorator for function profiling. + """ + def wrapper(func): + def profiled_func(*args, **kwargs): + # Flag for do profiling or not. + DO_PROF = True # os.getenv("PROFILING") + if DO_PROF: + profile = cProfile.Profile() + profile.enable() + result = func(*args, **kwargs) + profile.disable() + # Sort stat by internal time. + sortby = "tottime" + ps = pstats.Stats(profile).sort_stats(sortby) + ps.dump_stats(filename) + else: + result = func(*args, **kwargs) + return result + return profiled_func + return wrapper -- cgit 1.2.3-korg