diff --git a/.env b/.env index 54ec8d1..4c8a25b 100644 --- a/.env +++ b/.env @@ -1,9 +1,11 @@ OS_USERNAME=admin OS_PASSWORD=nVgmvBePxqPSxVkN7RwNKDJG OS_PROJECT_NAME=admin -OS_PROJECT_ID=8374bf1367ae40fdaf39f836b71d6bdb +OS_PROJECT_ID=8f526efe5899415f8cede048c5594aa4 OS_USER_DOMAIN_NAME=Default OS_PROJECT_DOMAIN_NAME=Default -OS_AUTH_URL=http://192.168.50.75:5000/v3 +OS_AUTH_URL=https://api.nexgencloud.com:5000/v3 OS_IDENTITY_API_VERSION=3 -OS_INTERFACE=internal +OS_INTERFACE=public + +REDIS_HOST=127.0.0.1 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..95afd81 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +.*egg-info.* +build* +dist* +.*python_netflow_v9_softflowd.egg-info/ +*.swp +*.swo +__pycache__ +*.json +venv +.idea +.env +/lib/ \ No newline at end of file diff --git a/main.py b/main.py index 8bde7ef..f24a337 100644 --- a/main.py +++ b/main.py @@ -1,13 +1,48 @@ import os, sys sys.path.append(os.path.join(os.path.dirname(__file__), "lib")) +from myOpenstackApp.logger import log + import myOpenstackApp - +testProjectName="SmokeTest" +testProjectExists=False +testProject="" y=myOpenstackApp.OSC y.initalise() # y.ks.getCatalog() -print(y.something()) +# print(y.something()) # print(y._keystone) -print("Starting") \ No newline at end of file +log.info("Starting") + +allProjects=y.ks.getAllProjects() + + +#Does my test project ID already exist? +for _project in allProjects['projects']: + if _project['name']==testProjectName: + testProject=_project + testProjectExists=True + + + +if testProjectExists: + log.error("Project already exists") + log.info(testProject['id']) + +else: + # Create test project + log.info("{} project does not exist, creating".format(testProjectName)) + testProject=y.ks.createProject(testProjectName,"Description goes here")['project'] + log.info(testProject['id']) + + + + +def cleanUp(): + #Delete VM + #Delete router + #Delete Network + #Delete project + pass \ No newline at end of file diff --git a/myOpenstackApp/OpenStackConnection.py b/myOpenstackApp/OpenStackConnection.py index 396d96a..70cefc6 100644 --- a/myOpenstackApp/OpenStackConnection.py +++ b/myOpenstackApp/OpenStackConnection.py @@ -13,6 +13,8 @@ class OpenStackConnection_x: catalogData="" novaURL="" + interface="" + token="" """ It's important not to initalise any of the submodules during the init cycle becuase thic causes cirtucalr import loops @@ -22,11 +24,13 @@ class OpenStackConnection_x: pass def initalise(self) -> None: + log.info("Initalising connection") from myOpenstackApp.keystone import myopenstack_keystone from myOpenstackApp.nova import myopenstack_nova self.ks=myopenstack_keystone(self) self.nova=myopenstack_nova(self) + self.interface=os.getenv("OS_INTERFACE") pass @@ -34,7 +38,7 @@ class OpenStackConnection_x: def something(_self): print(1) _self.ks.getCatalog() - print(_self.nova.getAllServers(os.getenv("OS_PROJECT_ID"))) + print(_self.nova.getAllServers(os.getenv("OS_PROJECT_ID"),True)) def make_request(_self, getPost, url, data, apiEndpoint, scopedProjectID=""): @@ -74,7 +78,7 @@ class OpenStackConnection_x: def getToken(_self,username, password, authDomain, scopeDomain, scopeProject): try: - return _self.lookupTokenFromRedis(username, authDomain, scopeDomain, scopeProject) + return _self.lookupToken(username, authDomain, scopeDomain, scopeProject) except exceptions.ItemNotFoundError: url = os.getenv("OS_AUTH_URL") + '/auth/tokens' @@ -114,16 +118,19 @@ class OpenStackConnection_x: if response.status_code == 201: try: - _self.saveTokenToRedis( username, authDomain, scopeDomain, scopeProject, response.headers['X-Subject-Token']) + _self.saveToken( 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): + def lookupToken(_self, username, authDomain, scopeDomain, scopeProject): + if _self.token!="": + return _self.token raise exceptions.ItemNotFoundError("OpenstackToken not found in redis") - def saveTokenToRedis(_self, username, authDomain, scopeDomain, scopeProject,token): - raise exceptions.ItemNotSavedError("OpenstackToken not saved in redis") + def saveToken(_self, username, authDomain, scopeDomain, scopeProject,token): + _self.token=token + #raise exceptions.ItemNotSavedError("OpenstackToken not saved in redis") diff --git a/myOpenstackApp/__pycache__/OpenStackConnection.cpython-310.pyc b/myOpenstackApp/__pycache__/OpenStackConnection.cpython-310.pyc index 67060d3..8fb2a6e 100644 Binary files a/myOpenstackApp/__pycache__/OpenStackConnection.cpython-310.pyc and b/myOpenstackApp/__pycache__/OpenStackConnection.cpython-310.pyc differ diff --git a/myOpenstackApp/__pycache__/__init__.cpython-310.pyc b/myOpenstackApp/__pycache__/__init__.cpython-310.pyc index fea3a0e..971c318 100644 Binary files a/myOpenstackApp/__pycache__/__init__.cpython-310.pyc and b/myOpenstackApp/__pycache__/__init__.cpython-310.pyc differ diff --git a/myOpenstackApp/__pycache__/exceptions.cpython-310.pyc b/myOpenstackApp/__pycache__/exceptions.cpython-310.pyc index 8095b6b..f551e38 100644 Binary files a/myOpenstackApp/__pycache__/exceptions.cpython-310.pyc and b/myOpenstackApp/__pycache__/exceptions.cpython-310.pyc differ diff --git a/myOpenstackApp/__pycache__/keystone.cpython-310.pyc b/myOpenstackApp/__pycache__/keystone.cpython-310.pyc index e4a3ece..0915f70 100644 Binary files a/myOpenstackApp/__pycache__/keystone.cpython-310.pyc and b/myOpenstackApp/__pycache__/keystone.cpython-310.pyc differ diff --git a/myOpenstackApp/__pycache__/logger.cpython-310.pyc b/myOpenstackApp/__pycache__/logger.cpython-310.pyc index c908d3a..4dfc033 100644 Binary files a/myOpenstackApp/__pycache__/logger.cpython-310.pyc and b/myOpenstackApp/__pycache__/logger.cpython-310.pyc differ diff --git a/myOpenstackApp/__pycache__/nova.cpython-310.pyc b/myOpenstackApp/__pycache__/nova.cpython-310.pyc index 4836ae3..7c1d730 100644 Binary files a/myOpenstackApp/__pycache__/nova.cpython-310.pyc and b/myOpenstackApp/__pycache__/nova.cpython-310.pyc differ diff --git a/myOpenstackApp/__pycache__/settings.cpython-310.pyc b/myOpenstackApp/__pycache__/settings.cpython-310.pyc index 6af37b7..31e8919 100644 Binary files a/myOpenstackApp/__pycache__/settings.cpython-310.pyc and b/myOpenstackApp/__pycache__/settings.cpython-310.pyc differ diff --git a/myOpenstackApp/keystone.py b/myOpenstackApp/keystone.py index 2a9f545..44ac4fb 100644 --- a/myOpenstackApp/keystone.py +++ b/myOpenstackApp/keystone.py @@ -7,11 +7,11 @@ import myOpenstackApp.OpenStackConnection class myopenstack_keystone(): - def __init__(self, connection): + def __init__(self,conn: myOpenstackApp.OpenStackConnection.OpenStackConnection_x ) -> None: self.serviceData={} self.catalogData={} self.projectData={} - self.connection=connection + self.connection=conn @@ -73,6 +73,14 @@ class myopenstack_keystone(): "name": name } } - _self.newProjectData=_self.requestor.make_request("POST", "projects", data, + + _self.newProjectData=_self.connection.make_request("POST", "projects", data, + os.getenv("OS_AUTH_URL")).json() + return _self.newProjectData + + def deleteProject(_self,id): + log.info("Deleting a project") + + _self.newProjectData=_self.connection.make_request("DELETE", "projects/"+id, "", os.getenv("OS_AUTH_URL")).json() return _self.newProjectData \ No newline at end of file diff --git a/myOpenstackApp/nova.py b/myOpenstackApp/nova.py index 7b16e00..4bdff27 100644 --- a/myOpenstackApp/nova.py +++ b/myOpenstackApp/nova.py @@ -13,13 +13,16 @@ class myopenstack_nova(): _self.myOpenstackObject.keystone.echo() def showNovaURL(_self): - return _self.conn.ks.getEndpointByNameAndInterface("nova","internal")["url"] + return _self.conn.ks.getEndpointByNameAndInterface("nova",_self.conn.interface)["url"] - def getAllServers(_self,projectID): - - return _self.conn.make_request("GET", "/servers/detail?all_tenants=True&project_id="+projectID, - "",_self.conn.ks.getEndpointByNameAndInterface("nova","internal")["url"] ).json() + def getAllServers(_self,projectID,all_tenants): + queryString="" + if all_tenants: + queryString="/servers/detail?all_tenants=True" + else: + queryString="/servers/detail?project_id="+projectID, + return _self.conn.make_request("GET", queryString,"",_self.conn.ks.getEndpointByNameAndInterface("nova",_self.conn.interface)["url"] ).json()