Advertisement
Guest User

quali_q12_intpy

a guest
Feb 2nd, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.27 KB | None | 0 0
  1. import requests
  2. import json
  3. import time
  4.  
  5.  
  6. class Sandbox:
  7. """
  8. Sandbox Python API wrapper
  9. """
  10.  
  11. def __init__(self, config_file):
  12. quali_config = json.load(open(config_file, 'r'))
  13. self.server_address = 'http://{}:{}/api'.format(quali_config['server_name'], quali_config['server_port'])
  14. self.username = quali_config['username']
  15. self.password = quali_config['password']
  16. self.domain = quali_config['domain']
  17. self.auth_code = ''
  18. self.headers = ''
  19.  
  20. def _request_and_parse(self, request_type, url_str, json_dict={}, data_dict={}):
  21. """
  22. :param request_type:
  23. :param url_str:
  24. :param json_dict:
  25. :param data_dict:
  26. :return:
  27. """
  28.  
  29. response = ''
  30. if request_type.lower() == 'put':
  31. response = requests.put(url_str, json=json_dict, headers=self.headers)
  32.  
  33. elif request_type.lower() == 'get':
  34. response = requests.get(url_str, json=json_dict, headers=self.headers)
  35.  
  36. elif request_type.lower() == 'post':
  37. response = requests.post(url_str, json=json_dict, headers=self.headers, data=json.dumps(data_dict))
  38.  
  39. if not response.ok:
  40. raise Exception('Error code: {}\nError text: {}\nP{} failed, exiting'.format(response.status_code,
  41. json.loads(response.text)[
  42. 'message'], url_str))
  43. return response
  44.  
  45. def login(self):
  46. """Login and set some internal variables
  47. """
  48. url_str = self.server_address + '/login'
  49. json_dict = {'username': self.username, 'password': self.password, 'domain': self.domain}
  50. response = self._request_and_parse('put', url_str, json_dict)
  51. self.auth_code = "Basic " + response.content[1:-1]
  52. self.headers = {"Authorization": self.auth_code, "Content-Type": "application/json"}
  53.  
  54. def get_blueprints(self):
  55. """Get all blueprints details
  56. :return: <dict> Dict of blueprints and their ids
  57. """
  58. url_str = '{}{}'.format(self.server_address, '/v2/blueprints')
  59. response = self._request_and_parse('get', url_str)
  60.  
  61. # parse the output
  62. parsed_response = json.loads(response.content)
  63. blueprint_names = [blueprint['name'].encode('utf-8') for blueprint in parsed_response]
  64. blueprint_ids = [blueprint['id'].encode('utf-8') for blueprint in parsed_response]
  65. blueprint_dict = dict(zip(blueprint_names, blueprint_ids))
  66.  
  67. # return a dictionary of blueprints names and their ids
  68. return blueprint_dict
  69.  
  70. def get_blueprint_id(self, blueprint_name):
  71. """Return blueprint id, given blueprint name
  72. :param blueprint_name: Name of the blueprint
  73. :return: blueprint_id
  74. """
  75.  
  76. # Get all blueprints and see if blueprint_name exists in the list
  77. blueprints = self.get_blueprints()
  78. if blueprint_name not in blueprints.iterkeys():
  79. raise Exception(
  80. 'Blueprint "{}" not found, exiting'.format(blueprint_name))
  81.  
  82. # If exists, return name of blueprint
  83. return blueprints[blueprint_name]
  84.  
  85. def get_blueprint_details(self, blueprint_id):
  86. """Returns a dict of the blueprint, given the blueprint id
  87. :param blueprint_id: blueprint_id
  88. :return: dict of name, estimated_setup_duration, description of the blueprint
  89. """
  90. url_str = '{}{}{}'.format(self.server_address, '/v2/blueprints/', blueprint_id)
  91. response = self._request_and_parse('get', url_str)
  92. parsed_blueprint_details = json.loads(response.content)
  93. return_dict = {'name': parsed_blueprint_details['name'],
  94. 'estimated_setup_duration': parsed_blueprint_details['estimated_setup_duration'],
  95. 'description': parsed_blueprint_details['description']}
  96. return return_dict
  97.  
  98. def get_blueprint_details_by_name(self, blueprint_name):
  99. """Create a sandbox from the provided blueprint name
  100. :param blueprint_name: blueprint name
  101. :return: dict of name, estimated_setup_duration, description of the blueprint
  102. """
  103. blueprint_id = self.get_blueprint_id(blueprint_name)
  104. return self.get_blueprint_details(blueprint_id)
  105.  
  106. def start_sandbox(self, blueprint_id, duration, sandbox_name=''):
  107. """Create a sandbox from the provided blueprint id
  108. :param blueprint_id: blueprint_id
  109. :param duration: duration in minutes
  110. :param sandbox_name: name of the sandbox, same as blueprint if name=''
  111. :return: if success sandbox_id, else False
  112. """
  113.  
  114. # Do some parameter validation
  115. try:
  116. int(duration)
  117. except ValueError:
  118. raise Exception('Duration "{}" has to be integer'.format(duration))
  119.  
  120. duration = 'PT{}M'.format(duration)
  121. if sandbox_name == '':
  122. sandbox_name = self.get_blueprint_details(blueprint_id)['name']
  123.  
  124. url_str = '{}{}{}/{}'.format(self.server_address, '/v2/blueprints/', blueprint_id, 'start')
  125. data_dict = {"duration": duration, "name": sandbox_name}
  126. response = self._request_and_parse('post', url_str, data_dict=data_dict)
  127. if response.ok:
  128. return json.loads(response.content)['id']
  129. else:
  130. return response.ok
  131.  
  132. def start_sandbox_by_name(self, blueprint_name, duration, sandbox_name=''):
  133. """Create a sandbox from the provided blueprint name
  134. :param blueprint_name: blueprint_name
  135. :param duration: duration in minutes
  136. :param sandbox_name: sandbox name
  137. :return: if success sandbox_id, else False
  138. """
  139. blueprint_id = self.get_blueprint_id(blueprint_name)
  140. if sandbox_name == '':
  141. sandbox_name = blueprint_name
  142. return self.start_sandbox(blueprint_id, duration, sandbox_name)
  143.  
  144. def get_sandboxes(self):
  145. """Returns a dictionary of all sandboxes name and their ids
  146. :return: A dict of sandbox ids and names
  147. """
  148. url_str = '{}{}'.format(self.server_address, '/v2/sandboxes')
  149. response = self._request_and_parse('get', url_str)
  150.  
  151. # parse the output
  152. parsed_response = json.loads(response.content)
  153. sandbox_names = [sandbox['name'].encode('utf-8') for sandbox in parsed_response]
  154. sandbox_ids = [sandbox['id'].encode('utf-8') for sandbox in parsed_response]
  155. sandbox_dict = dict(zip(sandbox_ids, sandbox_names))
  156.  
  157. # return a dictionary of sandboxes names and their ids
  158. return sandbox_dict
  159.  
  160. def get_sandbox_details(self, sandbox_id):
  161. """Returns a dictionary of the sandbox, its name, type and state
  162. :param sandbox_id: <str> Sandbox id
  163. :return: dictionary of sandbox name, type and state
  164. """
  165.  
  166. # Get info from cloudshell
  167. url_str = '{}{}{}'.format(self.server_address, '/v2/sandboxes/', sandbox_id)
  168. response = self._request_and_parse('get', url_str)
  169.  
  170. # parse the information
  171. parsed_blueprint_details = json.loads(response.content)
  172. #print "GET_SANDBOX_DETAILS"
  173. #print parsed_blueprint_details
  174.  
  175. # prepare a dictionary to return
  176. return_dict = {'name': parsed_blueprint_details['name'],
  177. 'type': parsed_blueprint_details['type'],
  178. 'state': parsed_blueprint_details['state']}
  179. return return_dict
  180.  
  181. def get_sandboxes_details_by_name(self, sandbox_name):
  182. """
  183. :param sandbox_name: Sandbox name
  184. :return: dictionary of sandbox name, type and state
  185. """
  186. return_dict = {}
  187. sandbox_ids = self.get_sandbox_ids(sandbox_name)
  188. for sandbox_id in sandbox_ids:
  189. return_dict[sandbox_id] = self.get_sandbox_details(sandbox_id)
  190. return return_dict
  191.  
  192. def get_sandbox_ids(self, sandbox_name):
  193. """Returns the sandbox ids for the given sandbox name
  194. :param sandbox_name: Sandbox name
  195. :return: Sandbox id
  196. """
  197. sandboxes = self.get_sandboxes()
  198. if sandbox_name not in sandboxes.itervalues():
  199. raise Exception(
  200. 'Sandbox "{}" not found, exiting'.format(sandbox_name))
  201.  
  202. sandbox_ids = [k for k, v in sandboxes.iteritems() if v == sandbox_name]
  203. return sandbox_ids
  204.  
  205. def stop_sandbox(self, sandbox_id):
  206. """Stop the sandbox given sandbox id
  207. :param sandbox_id: Sandbox id
  208. :return: True if success, False if not
  209. """
  210.  
  211. url_str = '{}{}{}/{}'.format(self.server_address, '/v2/sandboxes/', sandbox_id, 'stop')
  212. response = self._request_and_parse('post', url_str)
  213. return response.ok
  214.  
  215. def stop_sandboxes_by_name(self, sandbox_name):
  216. """Stop all the sandboxes with the given sandbox name
  217. :param sandbox_name: Sandbox name
  218. :return: True if success, False if not
  219. """
  220. sandbox_ids = self.get_sandbox_ids(sandbox_name)
  221. for sandbox_id in sandbox_ids:
  222. self.stop_sandbox(sandbox_id)
  223.  
  224. def get_sandbox_component_ids(self, sandbox_id):
  225. """Returns a dictionary of the sandbox, its name, type and state
  226. :param sandbox_id: <str> Sandbox id
  227. :return: dictionary of sandbox name, type and state
  228. """
  229.  
  230. # Get info from cloudshell
  231. url_str = '{}{}{}/{}'.format(self.server_address, '/v2/sandboxes/', sandbox_id, 'components')
  232. response = self._request_and_parse('get', url_str)
  233.  
  234. # parse the information
  235. parsed_blueprint_details = json.loads(response.content)
  236. #print "GET_SANDBOX_COMPONENT_IDS"
  237. #print parsed_blueprint_details
  238.  
  239. # prepare a dictionary to return
  240. return_dict = {'type': parsed_blueprint_details[0]['type'],
  241. 'id': parsed_blueprint_details[0]['id'],
  242. 'name': parsed_blueprint_details[0]['name']}
  243. return return_dict
  244.  
  245. def post_sandbox_component_id_command_start(self, sandbox_id, component_id, command_name, params):
  246. """Returns a dictionary of the sandbox, its name, type and state
  247. :param sandbox_id: <str> Sandbox id
  248. :return: dictionary of sandbox name, type and state
  249. """
  250.  
  251. # Get info from cloudshell
  252. url_str = '{}{}{}/{}/{}/{}/{}/{}'.format(self.server_address, '/v2/sandboxes/', sandbox_id, 'components', component_id, 'commands', command_name, 'start')
  253. response = self._request_and_parse('post', url_str, params)
  254.  
  255. # parse the information
  256. parsed_blueprint_details = json.loads(response.content)
  257. #print parsed_blueprint_details
  258.  
  259. # prepare a dictionary to return
  260. return_dict = {'executionId': parsed_blueprint_details['executionId'],
  261. 'supports_cancellation': parsed_blueprint_details['supports_cancellation']}
  262. return return_dict
  263.  
  264.  
  265. def main():
  266. #usage = """Usage:
  267. # Init vars
  268. blueprint_name = raw_input("Which blueprint to use: ") or "OrchestrationSample"
  269. sandbox_name = blueprint_name
  270. #blueprint_name = 'Sandbox Python API Test'
  271. #sandbox_name = 'Sandbox Python API Test'
  272. text = raw_input("What text should be sent: ") or "Hello world!"
  273. config_file = 'quali_config.json'
  274. my_sandbox = Sandbox(config_file=config_file)
  275. my_sandbox.login()
  276. print my_sandbox.get_blueprints()
  277. blueprint_id = my_sandbox.get_blueprint_id(blueprint_name=blueprint_name)
  278. print "Blueprint Id:", blueprint_id
  279. print my_sandbox.get_blueprint_details(blueprint_id=blueprint_id)
  280. print my_sandbox.get_blueprint_details_by_name(blueprint_name=blueprint_name)
  281. print my_sandbox.start_sandbox(blueprint_id=blueprint_id, duration='20', sandbox_name='')
  282. print my_sandbox.start_sandbox_by_name(blueprint_name=blueprint_name, duration='20', sandbox_name='')
  283. print "SANDBOXes:"
  284. print my_sandbox.get_sandboxes()
  285. sandbox_id = my_sandbox.get_sandbox_ids(sandbox_name=sandbox_name)
  286. print sandbox_id
  287. print my_sandbox.get_sandbox_details(sandbox_id=sandbox_id[0])
  288. print my_sandbox.get_sandboxes_details_by_name(sandbox_name=sandbox_name)
  289. print "COMPONENTS:"
  290. component_ids = my_sandbox.get_sandbox_component_ids(sandbox_id=sandbox_id[0])
  291. print component_ids
  292. component_id = component_ids.get('id')
  293. print component_id
  294. #params = { 'params': [{'name': 'parameter', 'value': 'Hello world!'}], 'printOutput': True }
  295. params = { 'params': [{'name': 'parameter', 'value': text}], 'printOutput': True }
  296. print params
  297. print my_sandbox.post_sandbox_component_id_command_start(sandbox_id[0],component_id,'Repeat', params)
  298. print "Sleeping for 20 seconds, before stopping Sandbox"
  299. time.sleep(20)
  300. #print my_sandbox.stop_sandbox(sandbox_id=sandbox_id[0])
  301. print my_sandbox.stop_sandboxes_by_name(sandbox_name=sandbox_name)
  302. #"""
  303.  
  304. #print usage
  305.  
  306.  
  307. if __name__ == '__main__':
  308. main()
  309.  
  310.  
  311. # # Contents of quali_config.json
  312. #{
  313. # "username" : "candidate",
  314. # "password" : "candidate",
  315. # "domain" : "CandidateTest",
  316. # "server_name" : "grabosky.dyndns.org",
  317. # "server_port" :"82"
  318. #}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement