import os import exceptions import requests import json import redis import ng_openstack.settings as settings appDebug = True def getToken(username, password, authDomain, scopeDomain, scopeProject): try: return lookupTokenFromRedis(username, authDomain, scopeDomain, scopeProject) except exceptions.ItemNotFoundError: url = os.getenv("OS_AUTH_URL") + '/auth/tokens' xdata = { "auth": { "scope": { "project": { "domain": { "name": scopeDomain }, "id": scopeProject } }, "identity": { "password": { "user": { "domain": { "name": authDomain }, "password": password, "name": username } }, "methods": [ "password" ] } } } response = requests.post(url) #print(xdata) headers = {'Content-type': 'application/json'} #if appDebug: print(url) response = requests.post(url, headers=headers, data=json.dumps(xdata), verify=False, timeout=4) if response.status_code == 201: saveTokenToRedis(username, authDomain, scopeDomain, scopeProject, response.headers['X-Subject-Token']) return response.headers['X-Subject-Token'] else: raise ValueError("Error in token response to token request:"+response.text) def lookupTokenFromRedis(username, authDomain, scopeDomain, scopeProject): REDIS=redis.Redis() REDIS = redis.Redis( host=os.getenv("REDIS_HOST"), port=6379, password="") RedisKey= "OpenstackToken_" + username + "_" + authDomain + "_" + scopeDomain + "_" + scopeProject try: if REDIS.exists(RedisKey): #print("Got token from redis") token=REDIS.get(RedisKey).decode("utf-8") return token else: raise exceptions.ItemNotFoundError("OpenstackToken not found in redis") except: raise exceptions.ItemNotFoundError("OpenstackToken not found in redis") def saveTokenToRedis(username, authDomain, scopeDomain, scopeProject,token): REDIS=redis.Redis() REDIS = redis.Redis( host=os.getenv("REDIS_HOST"), port=6379, password="") RedisKey = "OpenstackToken_" + username + "_" + authDomain + "_" + scopeDomain + "_" + scopeProject Token_CacheTimeout=150 # print("Saving Token to redis with a {} second timeout".format(Token_CacheTimeout)) try: REDIS.set(RedisKey,token) REDIS.expire(RedisKey, Token_CacheTimeout) return except: raise exceptions.ItemNotFoundError("OpenstackToken not saved in redis")