From 5101d81bf7832e5cf9a30d464e2f279cbcfe48c2 Mon Sep 17 00:00:00 2001 From: Cory Hawkless Date: Mon, 14 Nov 2022 12:17:16 +1030 Subject: [PATCH] Now creating a project or getting the existing one --- .env | 8 ++-- .gitignore | 12 +++++ main.py | 41 ++++++++++++++++-- myOpenstackApp/OpenStackConnection.py | 19 +++++--- .../OpenStackConnection.cpython-310.pyc | Bin 3566 -> 3670 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 253 -> 264 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 846 -> 857 bytes .../__pycache__/keystone.cpython-310.pyc | Bin 2759 -> 3094 bytes .../__pycache__/logger.cpython-310.pyc | Bin 345 -> 356 bytes .../__pycache__/nova.cpython-310.pyc | Bin 1674 -> 1757 bytes .../__pycache__/settings.cpython-310.pyc | Bin 207 -> 218 bytes myOpenstackApp/keystone.py | 14 ++++-- myOpenstackApp/nova.py | 13 +++--- 13 files changed, 87 insertions(+), 20 deletions(-) create mode 100644 .gitignore 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 67060d35fcd8e0487db3ca13d657d86dd4d54649..8fb2a6e5aa3ca3dfe435d7aa2a994beb33dc0b32 100644 GIT binary patch delta 1380 zcmZ`&O>ERg6!!RUZLfDpNH%HGP(l<+O!-Lz{jaKQQ__N}CCa9#-5w&#Gf9@+wU;+e zfM^j2(lbJ%9;#jvaVZivB+fllJ@wF255940FG#)i)c3snw2`ni-#kCRneY8Ref^J# za#AXJ8a^{WUWx7x-7EjVHtzj&c!?Vg2bb$=e3;w3uwynnlpOA&ROB8n?r064SGdnh zJFHRSWqtrPWj??MaX-Kh@*&&@xK-DJk*uO_6)I|)of&(;Y7ex4Wu_GEHE@tQhkq`q zE*l?-#nqEZSHv<6qgJ#bqSnbyYfgR7X4$Cvm3yuFu$0ACb zNvx{++wW%n#ro>`+RC}*#p=Sjpa?orXJ#{AOR~|<^^4Elt#-SoTH?A)lURVS?&@Q_ zM3#C>W@emhg_)kn%w89%h_^Dg8K(l)!bk)LxM&AH0iAf66`<0PY2P_9j-RrO;4vRx zPsd&Tt$)H!safM_nHzih9m)VjWvbAqTwVzZnbid(gM)OJhx7{}hMKIy5GhKisJ7d6 z0b2qj45JPz2v{O(_5U?`=8a4`BHh45y@_VhMsS$NCLTR8QpU#ACF>!ZQHCAa{kv4# z-WWcFR#^e5mJ*p}#wN7kxcbvRdt!!uI3Q#ad+~yqokQeSp3T*y$M8ue9P{(Uu-8yYqPtOv_!0)xMQbZ z1Pt$x)q4bU1ZN07K*(GfZi)N^%&1v!>d^b7HB)gd4Lrz0b2icWIP3`YA@SZi{xMlt z*EnVxs&rBA!i#RtGYMz$M@{|W-909$us!Xv##ze%horievR$3)d+as~j2c*Ip+s?d z$$)tjfd&EU2!WNm0AG{h8-fPGw*>nLmr-{MS6(!a*;uyiBkK3!k(&{f@%ckC^>{vK z)PX$HEVbT={|rpc+(pf9MWMoI1Z&L9?%*lS2Z z0SANXXaDp~>fC;}7NdUeeui6CprQI|`AZm~|MLVzf>DAu2tFmCGy{bWGeTWRWF D8l)=t delta 1261 zcmZ`&O>Epm6!zF&uh(mDwnFa{jh-BeMpwdi>0jBK=S)1hjGsD#z!^7VW5{kYMzR%~L+hr=j9s>C z+{UkC@0y2Ffg5W^XgBpO^Q;*<`e(D=En|pmVz}KJiA1GQcW{0*T1ezp1U^~Jfy!*! zh8DP}0P@dG&l-Rdd6xP~KaJwP5>vQU#G=o9=9!+pW-YPP`kwXT-d%Q^%A_)^<|9Vu zg4SAR^>XXtyUXp)`xnAuRv1A)NnwnP-iAn*BMd7ypqhK5;(Q#h3D^>#GE=I|L6u0h zkk~@!zsw#MrjXsV*H1QP0}P=Y1ebZN{@{w8GB%-qDtyQ0^tRJ=oEE5+v&o+fhUwZIE@q0E+SCzS=NU7@* zIJ`qiRuDoHR`i#pnW>YcnL${2WRuTc}Y))Hm4S7{x0hI@)zSz=)P0q8^+mPc8i5(Q~y?;d(Q-m&bAQ3 zLY@fPr1*&7V}dILN5VEyw~OBs8g!5C%OhC`zZ zRox2edqfKyBd8NB5fE!YJpx7kSGGJa{Y*e(K!Tb^a1EQ~uW2*W^lZ;^JG3CJ&>rXs5y{?Pi*V4?b~or45=u`>HNXP6as diff --git a/myOpenstackApp/__pycache__/__init__.cpython-310.pyc b/myOpenstackApp/__pycache__/__init__.cpython-310.pyc index fea3a0ebd69d95afd0b36a8873039813d6baa78a..971c318e3060b31a26eae5220f381affb3b0bf92 100644 GIT binary patch delta 72 zcmey%*ulh|&&$ij00ew93MX>UGW6EZ$j?pHPtGr@)OX1*&&$bAOeqF(Q&RQwQpNJ? delta 61 zcmeBR`pd|j&&$ij00e50X%o3;sX6FpbvBZ=jG%lrW6CYDXIDel_eSZ MdA>kq&ctg*03x{*YXATM diff --git a/myOpenstackApp/__pycache__/exceptions.cpython-310.pyc b/myOpenstackApp/__pycache__/exceptions.cpython-310.pyc index 8095b6b90f2231f76b313c21c8bae82f1b24e6a0..f551e38a568c9beca99564536d88247fe94802c7 100644 GIT binary patch delta 54 zcmX@dc9V@epO=@50SNeJ6mI06#K`D7c^;#bSYB$mZhk>(UU5lca&~e?YI3%2Znn|p I!;IaG0H0$J-v9sr delta 43 xcmcb~c8-lZpO=@50SI(!GB$EgVq|ohJdaU|yP&cpBR|hKKP5G1^Et+DMgaRQ4DA2_ diff --git a/myOpenstackApp/__pycache__/keystone.cpython-310.pyc b/myOpenstackApp/__pycache__/keystone.cpython-310.pyc index e4a3ece313b43b5afd7c88146259e606a74c10f6..0915f70a04a673f7f954cf2fddd6a411a5394ac9 100644 GIT binary patch delta 1187 zcmZ`&OHUL*5T2g*Ec=3e@K6+VeGCyaNDLPf32;#Z81O=3HtTewv#>L3&nSWdT`vrH9`?K!g=WC`GuL5(ZEy>veFz1FB0>p4M=$_vg_je)BgGn% zOoz(Hn}e_yvP%z?STB?yQ>}D+@f1q>tKfDLmo$D7FI9`5K1jVNt+O9N2<#$1&4iy z^h;C?)s{xJHfgIZy$#x`0Tu=fufDL|H^(+u=z5PvY9q}~VM3pqzdOG&zik}}f~)a( z&BO=g6OhZ6yDp)tKcEsBiV@k-Deqxm*EtnxnpWO7rnMByCU1zT1+0%OtUEp zxLd|2H4ASEy5;(wDE&iNeaKd5RIm$H9igU$W4vqPsWYjr7FJxWW@P( delta 915 zcmZvbyKmD#7{LAZ*-qS~B&7uk0RpN!5QGpLQjj`A8>vi{P-XcpN+7Y#*$@SWE(iuD zbP{4hEDRl(7(il1%&Z3s{0S^PCce*+MOtCYzwdG1>rUtA%b%KlQmwiQJg;61qF?Sa z|M4vitS)@nbpTU#RI2P~RHfP@Wk;tvH9#8Fq!vh%+LVB_s6$es)Y>Z+WCf};cQZEX7d2*Z#TV@ztH7#sSWMGo80Q)H!R8C-BpKuPhY`yH zo8thyhNvSJ5l0XP!UP05Zr&5hF3nLgVZ2N}h9Lw7 zEgBz~^_#&iufTGkZ}Os&5r<>Oj~A|4>lWzzBx1hx1M{Q0B)Zn>6&#bFK&%1+W0r+I z`B{K;cFSWpP(WC}dqvO^MxH6dA^$Y$hpL)$vtU(Tq_$C;o9gXXyRPoFz$=a3*7i+a z#Q;3^fN;E1(iq15L^_<^y~naV;r}~*>Bnr+CnVzit1Pl~&svLquv&o@6MHD|IOqZt71%nX76 diff --git a/myOpenstackApp/__pycache__/nova.cpython-310.pyc b/myOpenstackApp/__pycache__/nova.cpython-310.pyc index 4836ae38e1b2bb827df287f243b6e55d946d9a20..7c1d730316ea1980427f7ed439448643bbc3382f 100644 GIT binary patch delta 481 zcmZ8dJx>Bb5WTtGI|7OpegGO1j0Hk47qPN1CVoV1Xduy!Ty7WPICgRGgg_vaCbnDJ zKxt|GHEyDR!`3}RESzNC&g|Qn_p;CF&-4mUr&ETG?8}39iQiV%;qc07@h){dE{4tp zAFzPCB-AaT4x@tu-lHsxT(9G`sMk5@b}H}J@C4`N$iK56|soF zSS1(BZZ6c)pKcVYB|R#JwMd{gyO+nfkivk$hLl+X>EpZ1mYyE1I?cfC^FQk%CqFQQ a9eHiN+Ijs#?8$Gd0x4Ot%TSQF_R$X%PJp2R delta 387 zcmXYtze~eF6vyvZQd^oj7!9o;I#^991auN~vLX%^q#fK!=tbI?=ISM_w$xb=w;Np& zaM4A?*?%PB=;A-2chU#nckk}qeZG(TGVYBMGmHX|@%_~6e&V;139I`~j}1Jh%lO1; zuesqhq1>) zH^}ga2R0Tu-WGef22GJ7Q{3R<8BznxL)CeyL#e1HlcFb3v1iZ%6#u)S1XDsa>86)K zN)nPP&s;OZ$4BjHUHstnc6G>^?{(u&pB`j@FG&_xi{NWW|Ad>2INctzB; e5LU#a_N=cd?1p&NE#c~`Feh&HI@}a5`tBd7;$zkT diff --git a/myOpenstackApp/__pycache__/settings.cpython-310.pyc b/myOpenstackApp/__pycache__/settings.cpython-310.pyc index 6af37b7daa6fac1ce632f3d63b3bffb3101fe60b..31e89197e3346d7f27114ae07fc298af76b754c8 100644 GIT binary patch delta 72 zcmX@lc#DxcpO=@50SNeJ6i(#MG4$5Y$j?pHPtGr@)OX1*&&$bAOeqF(Q&RQwQp7*GHJ delta 61 zcmcb`c%G3vpO=@50SKPgWK87FQFGAG$j?pHPtGr@)OX1*&&$bAOeqF(Q&RN{DoZl* M^L&BKoQW%p08UU97ytkO 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()