import requests import redis import json import os from ng_openstack.logger import log from ng_openstack import exceptions class Openstack_Request: def make_request(_self, getPost, url, data, apiEndpoint, scopedProjectID=""): log.debug("Making a request {} {} ".format(apiEndpoint,url)) # Default the scope project to the value set in .env.example, allow the user to override if required(EG creating backups) if scopedProjectID== "": scopedProjectID=os.getenv("OS_PROJECT_ID") else: scopedProjectID=scopedProjectID str(url).replace(" ","%20") data_json = json.dumps(data) token = _self.getToken(os.getenv("OS_USERNAME"), os.getenv("OS_PASSWORD"), os.getenv("OS_USER_DOMAIN_NAME"), os.getenv("OS_USER_DOMAIN_NAME"), scopedProjectID) # print (token) headers = {'Content-type': 'application/json', 'X-Auth-Token': token} url = apiEndpoint + "/" + url if getPost=="GET": response = requests.get(url, headers=headers) elif getPost=="POST": response = requests.post(url, data=data_json, headers=headers) else: raise ValueError("Unknown request type") if 200<= response.status_code <= 300 : return response else: raise ValueError ("Error in response return code" + str(response.status_code) + str(response.content)) def getToken(_self,username, password, authDomain, scopeDomain, scopeProject): try: return _self.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) headers = {'Content-type': 'application/json'} response = requests.post(url, headers=headers, data=json.dumps(xdata), verify=False, timeout=4) if response.status_code == 201: try: _self.saveTokenToRedis( username, authDomain, scopeDomain, scopeProject, response.headers['X-Subject-Token']) except exceptions.ItemNotSavedError: log.warn("Error saving token to redis..meh") return response.headers['X-Subject-Token'] else: raise ValueError("Error in token response to token request:"+response.text) def lookupTokenFromRedis(_self, 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(_self, 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.ItemNotSavedError("OpenstackToken not saved in redis")