在给我司写一个环境资源大户统计的脚本。遇到的一个问题是nova,cinder这种服务里面存的都是租户的tenant id。一串uuid,没法对应到人。
这倒是也好办,keystone里面有个接口可以查出对应tenant id的的tenant name。但是每次统计完都去查一遍keystone调起码几百次不是特傻(而且慢)。租户id和名字这个映射属于基本上都不会改的,应该缓存起来。
既然是脚本,那么就缓存到文件中好了。google一下,有个现成的轮子。
# cache, use json to store cache
def persist_to_file(file_name):
def decorator(original_func):
try:
cache = json.load(open(file_name, 'r'))
except (IOError, ValueError):
cache = {}
def new_func(param):
if param not in cache:
cache[param] = original_func(param)
json.dump(cache, open(file_name, 'w'), indent=4)
return cache[param]
return new_func
return decorator
然后,有了这个装饰器之后,在需要缓存的函数前面加一下即可。如下:
@persist_to_file('cache.dat')
def tenantid_to_tenant_name(tenantid):
headers = {'X-Auth-Token': TOKEN}
r = requests.get(
"{}:35357/v2.0/tenants/{}".format(HA, tenantid),
headers=headers)
result_json = json.loads(r.text)
name = result_json['tenant']['name']
return name
如果已经缓存在文件中了,那就直接读文件;如果没读到,就去查一下,然后插到文件里。
超级方便有木有!!