diff --git a/main.py b/main.py index 5aab4eb..7c30223 100644 --- a/main.py +++ b/main.py @@ -1,9 +1,25 @@ import ng_openstack.auth import ng_openstack.keystone import os +import json -token = ng_openstack.auth.getToken(os.getenv("OS_USERNAME"), os.getenv("OS_PASSWORD"), - os.getenv("OS_USER_DOMAIN_NAME"), os.getenv("OS_USER_DOMAIN_NAME"), - os.getenv("OS_PROJECT_ID")) -print(token) -print (ng_openstack.keystone.getCatalog()) \ No newline at end of file + +import ng_openstack + +x=ng_openstack.OpenstackConnection("Fido",10) +print (x.keystone.getAllProjects()) + + +# token = ng_openstack.auth.getToken(os.getenv("OS_USERNAME"), os.getenv("OS_PASSWORD"), +# os.getenv("OS_USER_DOMAIN_NAME"), os.getenv("OS_USER_DOMAIN_NAME"), +# os.getenv("OS_PROJECT_ID")) +# print(token) + +# # print(json.dumps(ng_openstack.keystone.getAllProjects(), indent=4)) +# cat=ng_openstack.keystone.getCatalog() + + +# print (ng_openstack.keystone.getServicebyID("11f21a87fdaa4f5d9bd93c7396bdd93c")) + +# # openstack=newOpenstack.connect() +# # projects=openstack.projects.getAll() \ No newline at end of file diff --git a/ng_openstack/__init__.py b/ng_openstack/__init__.py index e69de29..9d149aa 100644 --- a/ng_openstack/__init__.py +++ b/ng_openstack/__init__.py @@ -0,0 +1,59 @@ +import imp +from ng_openstack.auth import Openstack_Auth +from ng_openstack.openstackRequest import Openstack_Request +from ng_openstack.keystone import Openstack_Keystone + +class OpenstackConnection(): + auth=Openstack_Auth + requestor=Openstack_Request() + keystone=Openstack_Keystone(requestor) + + + def __init__(self, name, age): + self.name = name + self.age = age + self.speed = 0 + self.moving = False + + @property + def human_age(self): + return self.age * 7 + + @human_age.setter + def human_age(self, value): + self.age = value / 7 + + def __str__(self): + return '{} is {} years old'.format( + self.name, self.age + ) + + def __eq__(self, other): + return self.name == other.name and self.age == other.age + + def make_sound(self): + print(self.SOUND) + + def bark(self): + self.make_sound() + + def walk(self, speed, distance): + self._set_speed(speed) + self._move(distance) + + @classmethod + def can_woof(cls, animal): + return animal.SOUND == cls.SOUND + + @staticmethod + def is_dog(animal): + return animal.can_woof() + + def _set_speed(self, speed): + self.speed = speed + + def _move(self, distance): + self.moving = True + for _ in range(distance): + print('.', end='') + print('') \ No newline at end of file diff --git a/ng_openstack/auth.py b/ng_openstack/auth.py index 01d3dc1..77f8cd8 100644 --- a/ng_openstack/auth.py +++ b/ng_openstack/auth.py @@ -1,98 +1,99 @@ -import os -import exceptions -import requests -import json -import redis -import ng_openstack.settings as settings +class Openstack_Auth: + + import os + import exceptions + import requests + import json + import redis + import ng_openstack.settings as settings -appDebug = True + appDebug = True -def getToken(username, password, authDomain, scopeDomain, scopeProject): + def getToken(username, password, authDomain, scopeDomain, scopeProject): - try: - return lookupTokenFromRedis(username, authDomain, scopeDomain, scopeProject) - except exceptions.ItemNotFoundError: + 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": { + url = os.getenv("OS_AUTH_URL") + '/auth/tokens' + xdata = { + "auth": { + "scope": { + "project": { "domain": { - "name": authDomain + "name": scopeDomain }, - "password": password, - "name": username + "id": scopeProject } }, - "methods": [ - "password" - ] + "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) + #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) + 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) + 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): -def lookupTokenFromRedis(username, authDomain, scopeDomain, scopeProject): + REDIS=redis.Redis() - 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") - 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): -def saveTokenToRedis(username, authDomain, scopeDomain, scopeProject,token): + REDIS=redis.Redis() - 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") + 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") diff --git a/ng_openstack/keystone.py b/ng_openstack/keystone.py index 54b1d77..aa88455 100644 --- a/ng_openstack/keystone.py +++ b/ng_openstack/keystone.py @@ -1,15 +1,38 @@ +import imp import json import ng_openstack.openstackRequest +import ng_openstack.settings +import os -def getAllProjects(): - projectData=ng_openstack.openstackRequest.openstackRequest("GET", "v3/projects", "", - "http://172.25.110.138:5000").json() - return projectData +class Openstack_Keystone(): + def __init__(self, requestor): + self.serviceData={} + self.catalogData={} + self.projectData={} + self.requestor=requestor + + + + def getAllProjects(_self): + _self.projectData=_self.requestor.make_request("GET", "projects", "", + os.getenv("OS_AUTH_URL")).json() + return _self.projectData -def getCatalog(): - catalogData=ng_openstack.openstackRequest.openstackRequest("GET", "v3/endpoints", "", - os.getenv("OS_AUTH_URL")).json() - return catalogData + def getCatalog(): + catalogData=json.dumps(ng_openstack.openstackRequest.openstackRequest("GET", "endpoints", "", + os.getenv("OS_AUTH_URL")).json()) + serviceData=json.dumps(ng_openstack.openstackRequest.openstackRequest("GET", "services", "", + os.getenv("OS_AUTH_URL")).json()) + print(serviceData) + + return serviceData + + + def getServicebyID(id): + print(serviceData) + # for _service in service_Data['services']: + # if _service['id']==id: + # return(_service) \ No newline at end of file diff --git a/ng_openstack/openstackRequest.py b/ng_openstack/openstackRequest.py index ff5754f..3ccfd12 100644 --- a/ng_openstack/openstackRequest.py +++ b/ng_openstack/openstackRequest.py @@ -1,37 +1,37 @@ import requests import json import ng_openstack.auth -import settings,os +import os +class Openstack_Request: + def make_request(_self, getPost, url, data, apiEndpoint, scopedProjectID=""): -def openstackRequest(getPost, url, data, apiEndpoint, scopedProjectID=""): + # 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 - # 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("SNGD_OPENSTACK_SCOPEPROJECTID") - else: - scopedProjectID=scopedProjectID + str(url).replace(" ","%20") - str(url).replace(" ","%20") + data_json = json.dumps(data) - data_json = json.dumps(data) + token = ng_openstack.auth.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} - token = ng_openstack.auth.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 + print (url) + # print(data_json) + 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") - url = apiEndpoint + "/" + url - # print (url) - # print(data_json) - 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)) + if 200<= response.status_code <= 300 : + return response + else: + raise ValueError ("Error in response return code" + str(response.status_code) + str(response.content))