Advertisement
Guest User

Untitled

a guest
Oct 26th, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.67 KB | None | 0 0
  1. #!/usr/bin/python
  2. import requests
  3. import getpass
  4. import json
  5. from pprint import pprint
  6.  
  7. from requests.packages.urllib3.exceptions import InsecureRequestWarning
  8. requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
  9.  
  10. host = "0.188.131.20"
  11. base_url = "https://" + host + "/rest/"
  12.  
  13. fabric_key = ""
  14.  
  15. def get_fabrics(session,host):
  16. url = base_url + "resourcegroups/All/fcfabrics"
  17. #print url
  18. try:
  19. response = session.get(url=url)
  20. #print response
  21. return json.loads(response.content)
  22. except:
  23. print "Unable to retrieve fabrics"
  24. return None
  25. return response.content
  26.  
  27. def login(session):
  28. url = base_url + "login"
  29. try:
  30. response = session.post(url=url)
  31. #print dir(response)
  32. #print response
  33. #print response.headers
  34. except Exception as e:
  35. print e
  36. print "Unable to login"
  37. return None
  38. return response.headers['WStoken']
  39.  
  40. def logout(connection, WStoken):
  41. url = base_url + 'logout'
  42. print("URL: " + url)
  43. connection.request('POST', url,
  44. headers={"WStoken": WStoken,
  45. "Accept": "application/vnd.brocade.networkadvisor+json;version=v1"})
  46. print("Logging out of BNA...")
  47. # Get the response
  48. response = connection.getresponse()
  49. # Display the response status
  50. print("Status=", response.status)
  51. # If successful (status = 204), display the returned Network Advisor session token
  52. if response.status == 204:
  53. print("Logout successful!")
  54. else:
  55. print(response.status, response.reason)
  56. connection.close()
  57.  
  58. #step1 - dont use
  59. def start_zoning(WStoken, session, fabric_key):
  60. print("Starting Zoning Transaction...")
  61. data = {
  62. "lsanZoning": "false",
  63. "action": "START"
  64. }
  65. headers = {
  66. "WStoken": WStoken,
  67. "Accept": "application/vnd.brocade.networkadvisor+json;version=v1",
  68. "Content-type": "application/vnd.brocade.networkadvisor+json;version=v1"
  69. }
  70. url = base_url + 'resourcegroups/All/fcfabrics/{}/controlzonetransaction'
  71. print("URL: " + url.format(fabric_key))
  72. r = requests.post(url.format(fabric_key), data=json.dumps(data), headers=headers, verify=False)
  73. print("Status=", r.status_code)
  74. # If successful (status = 204), continue with creation of Aliases, Zones and commit transaction
  75. if r.status_code == 204:
  76. return True
  77. else:
  78. return False
  79.  
  80. #step2
  81. def create_zoning_objects(WStoken, payload, fabric_key):
  82. print("Creating Aliases and Zones...")
  83. url = base_url + 'resourcegroups/All/fcfabrics/{}/createzoningobject'
  84. data=payload
  85. headers={
  86. "WStoken": WStoken,
  87. "Accept": "application/vnd.brocade.networkadvisor+json;version=v1",
  88. "Content-type": "application/vnd.brocade.networkadvisor+json;version=v1"
  89. }
  90. if confirm("Create the following zoning object:", data):
  91. r = requests.post(url.format(fabric_key), data=json.dumps(data), headers=headers, verify=False)
  92. print("Status=", r.status_code)
  93. return True
  94. else:
  95. return False
  96.  
  97. def make_zoning_payload():
  98. payload = {"zones": [], "zoneAliases": []}
  99. while again("Do you want to create an alias?"):
  100. name = raw_input('Alias name: ')
  101. wwn = raw_input('Enter all wwns seperated by commas: ')
  102. payload['zoneAliases'].append({"name":name, "memberNames":wwn.split(',')})
  103. while again("Do you want to create a zone? "):
  104. name = raw_input("Zone name")
  105. aliases = raw_input("Enter all aliases for this zone seperated by commas:")
  106. payload['zones'].append({"name": name, "aliasNames": aliases.split(',')})
  107. return payload
  108.  
  109. def test_zoning_payload():
  110. return {
  111. "zones": [{
  112. "name": "host1_hba0_array_sp0", #make parameter
  113. "aliasNames": [
  114. "host_hba0",
  115. "array_sp0"],
  116. "type": "STANDARD"
  117. }],
  118. "zoneAliases": [{
  119. "name": "host_hba0",
  120. "memberNames": [
  121. "11:22:33:44:55:66:77:88"
  122. ]},{
  123. "name": "array_sp0",
  124. "memberNames": [
  125. "88:77:66:55:44:33:22:11"
  126. ]}]}
  127.  
  128. #step 3
  129. def make_cfg_payload():
  130. payload = {"action":"ADD", "zoneSets":[]}
  131. while again("Do you want to add a zone to cfg?"):
  132. name = raw_input("fabric name:")
  133. zones = raw_input("zone_names:")
  134. payload['zoneNames'].append({"name": name, "zoneNames": zones.split(',')})
  135. return payload
  136.  
  137. def test_cfg_payload():
  138. return {
  139. "action": "ADD",
  140. "zoneSets": [
  141. {
  142. "name": "home_fabric",
  143. "zoneNames": [
  144. "host1_hba0_array_sp0"
  145. ]
  146. }
  147. ]
  148. }
  149.  
  150. def add_zoning_to_CFG(WStoken, payload, fabric_key):
  151. print("Adding Zones to CFG...")
  152. url = base_url + 'resourcegroups/All/fcfabrics/{}/updatezoningobject'
  153. data = make_cfg_payload()
  154. headers = {
  155. "WStoken": WStoken,
  156. "Accept": "application/vnd.brocade.networkadvisor+json;version=v1",
  157. "Content-type": "application/vnd.brocade.networkadvisor+json;version=v1"
  158. }
  159. if confirm("Add the following zone to the cfg:", data):
  160. r = requests.post(url.format(fabric_key), data=json.dumps(data), headers=headers)
  161. print("Status=", r.status_code)
  162. return True
  163. else:
  164. return False
  165.  
  166. #step 4
  167. def commit_zoning_transaction(WStoken, fabric_key):
  168. print("Committing Zoning Transaction...")
  169. url = base_url + 'resourcegroups/All/fcfabrics/{}/controlzonetransaction'
  170. data = {
  171. "lsanZoning": "false",
  172. "action": "COMMIT"
  173. }
  174. headers = {
  175. "WStoken": WStoken,
  176. "Accept": "application/vnd.brocade.networkadvisor+json;version=v1",
  177. "Content-type": "application/vnd.brocade.networkadvisor+json;version=v1"
  178. }
  179. if confirm("Are you ready to commit?", None):
  180. r = requests.post(url.format(fabric_key), data=json.dumps(data), headers=headers)
  181. print("Status=", r.status_code)
  182. return True
  183. else:
  184. return False
  185.  
  186. #step 5
  187. def activate_CFG(connection, WStoken, fabric_key):
  188. print("Activating CFG...")
  189. url = base_url + 'resourcegroups/All/fcfabrics/{}/zonesets/home_fabric-false/activate'
  190. data = {
  191. }
  192. headers = {
  193. "WStoken": WStoken,
  194. "Accept": "application/vnd.brocade.networkadvisor+json;version=v1",
  195. "Content-type": "application/vnd.brocade.networkadvisor+json;version=v1"
  196. }
  197. print("URL: " + url)
  198. r = requests.post(url.format(fabric_key), data=json.dumps(data), headers=headers)
  199. print("Status=", r.status_code)
  200. print()
  201. url = base_url + 'resourcegroups/All/fcfabrics/' + fabric_key + '/zonedbs'
  202. print("URL: " + url)
  203. print("Displaying updated contents of Zoning DB for fabric...")
  204. connection.connect()
  205. connection.request('GET', url,
  206. headers={"WStoken": WStoken,
  207. "Accept": "application/vnd.brocade.networkadvisor+json;version=v1"})
  208. # Get the response
  209. response = connection.getresponse()
  210. # Display the response status
  211. print("Status=", response.status)
  212. # If successful (status = 200), display the returned list in JSON format
  213. if response.status == 200:
  214. print("Zone DB:")
  215. json_response_bytes = response.read()
  216. json_response_string = str(json_response_bytes, encoding='utf8')
  217. zone_db_dict = json.loads(json_response_string)
  218. print(json.dumps(zone_db_dict, indent=4))
  219. else:
  220. print(response.status, response.reason)
  221. connection.close()
  222.  
  223. ###GET USER INTERACTION#####
  224. def again(prompt):
  225. response = raw_input(prompt)
  226. if response in ['Y', 'y', 'Yes', 'YES', 'yes', 'ye']:
  227. return True
  228. return False
  229.  
  230. def confirm(message, object):
  231. print(message)
  232. pprint(object)
  233. return again("Does this look right? :")
  234.  
  235.  
  236.  
  237.  
  238. user = getpass.getuser()
  239. password = getpass.getpass("Enter your password: ")
  240. session = requests.Session()
  241. session.verify = False
  242. session.headers.update({"WSUsername":"%s" % user ,"WSPassword":"%s" % password,"Accept":"application/vnd.brocade.networkadvisor+json;version=v1"})
  243. session.auth = (user,password)
  244. token = login(session)
  245. session.headers.update({"WStoken":"%s" % token})
  246.  
  247. content = get_fabrics(session,host)
  248.  
  249. fabric_key = raw_input("Fabric Key:")
  250.  
  251. start_zoning(token, fabric_key)
  252. payload = make_zoning_payload()
  253. create_zoning_objects(token, payload, fabric_key)
  254. #commit_zoning_transaction(token, fabric_key)
  255. #activate_CFG(session, token, fabric_key)
  256.  
  257.  
  258. #print json.dumps(content,indent=4)
  259.  
  260. #wwn = content['fcFabrics'][0]['principalSwitchWwn']
  261. #print content
  262.  
  263. #TODO: look for collisions
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement