new-openstackcheck/ng_openstack/openstackRequest.py

130 lines
4.9 KiB
Python
Raw Normal View History

2022-10-10 05:25:49 +00:00
import requests
2022-10-12 04:31:48 +00:00
import redis
2022-10-10 05:25:49 +00:00
import json
2022-10-10 06:33:10 +00:00
import os
2022-11-02 05:30:36 +00:00
from ng_openstack.logger import log
2022-10-12 04:31:48 +00:00
from ng_openstack import exceptions
2022-10-10 06:33:10 +00:00
class Openstack_Request:
def make_request(_self, getPost, url, data, apiEndpoint, scopedProjectID=""):
2022-11-02 05:30:36 +00:00
log.debug("Making a request {} {} ".format(apiEndpoint,url))
2022-10-10 06:33:10 +00:00
# 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
2022-10-10 05:25:49 +00:00
2022-10-10 06:33:10 +00:00
str(url).replace(" ","%20")
2022-10-10 05:25:49 +00:00
2022-10-10 06:33:10 +00:00
data_json = json.dumps(data)
2022-10-10 05:25:49 +00:00
2022-10-12 04:31:48 +00:00
token = _self.getToken(os.getenv("OS_USERNAME"), os.getenv("OS_PASSWORD"),
2022-10-10 06:33:10 +00:00
os.getenv("OS_USER_DOMAIN_NAME"), os.getenv("OS_USER_DOMAIN_NAME"),
scopedProjectID)
# print (token)
headers = {'Content-type': 'application/json', 'X-Auth-Token': token}
2022-10-10 05:25:49 +00:00
2022-10-10 06:33:10 +00:00
url = apiEndpoint + "/" + url
2022-11-02 05:30:36 +00:00
2022-10-10 06:33:10 +00:00
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")
2022-10-10 05:25:49 +00:00
2022-10-10 06:33:10 +00:00
if 200<= response.status_code <= 300 :
return response
else:
raise ValueError ("Error in response return code" + str(response.status_code) + str(response.content))
2022-10-12 04:31:48 +00:00
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": {
2022-11-03 00:29:58 +00:00
"scope": {
"project": {
2022-11-02 06:10:46 +00:00
"domain": {
2022-11-03 00:29:58 +00:00
"name": scopeDomain
2022-11-02 06:10:46 +00:00
},
2022-11-03 00:29:58 +00:00
"id": scopeProject
2022-11-02 06:10:46 +00:00
}
2022-10-12 04:31:48 +00:00
},
2022-11-03 00:29:58 +00:00
"identity": {
"password": {
"user": {
"domain": {
"name": authDomain
},
"password": password,
"name": username
}
},
"methods": [
"password"
]
}
2022-10-12 04:31:48 +00:00
}
}
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:
2022-11-02 05:30:36 +00:00
try:
_self.saveTokenToRedis( username, authDomain, scopeDomain, scopeProject, response.headers['X-Subject-Token'])
except exceptions.ItemNotSavedError:
log.warn("Error saving token to redis..meh")
2022-10-12 04:31:48 +00:00
return response.headers['X-Subject-Token']
else:
raise ValueError("Error in token response to token request:"+response.text)
2022-10-12 06:28:07 +00:00
def lookupTokenFromRedis(_self, username, authDomain, scopeDomain, scopeProject):
2022-10-12 04:31:48 +00:00
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")
2022-10-12 06:28:07 +00:00
def saveTokenToRedis(_self, username, authDomain, scopeDomain, scopeProject,token):
2022-10-12 04:31:48 +00:00
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:
2022-11-02 05:30:36 +00:00
raise exceptions.ItemNotSavedError("OpenstackToken not saved in redis")
2022-10-12 04:31:48 +00:00