Advertisement
Guest User

Untitled

a guest
Jan 15th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.63 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. ##############################################################
  4. # Remove VM by name on ESXI
  5. #
  6. ##############################################################
  7. ##############################################################
  8. # author: Valeriy Solovyov <weldpua2008@gmail.com>
  9. # version 0.1 <3.11.2015>
  10. # - initial
  11. ##############################################################
  12. from pysphere.resources import VimService_services as VI
  13. from pysphere import VIException
  14. from pysphere import VIServer
  15. from pysphere.vi_task import VITask
  16. import logging
  17. import sys
  18. import argparse
  19. import base64
  20. import getpass
  21. import time
  22.  
  23.  
  24. def vm_by_name(name, con):
  25. """Find vm by name
  26. :param name:
  27. :param con:
  28. :return:
  29. """
  30. try:
  31. vm = con.get_vm_by_name(name)
  32. logging.debug('Found VM %s' % vm.properties.name)
  33. return vm
  34. except VIException:
  35. return None
  36.  
  37.  
  38. def get_vm_by_name_started_with(name, con):
  39. """get all vm that start with 'name'"""
  40. vms = []
  41. vmlist = []
  42. if len(name) < 5:
  43. print "get_vm_by_name_started_with: name less then 4 symbols"
  44. return vmlist
  45. try:
  46. vmlist = con.get_registered_vms()
  47. except Exception as error:
  48. print error
  49. sys.exit(126)
  50. for vm_path in vmlist:
  51. try:
  52. vm = con.get_vm_by_path(vm_path)
  53. vm_name = vm.properties.name
  54. if vm_name.startswith(name):
  55. vms.append(vm)
  56. except Exception as error:
  57. print "Got an error %s" % error
  58. return vms
  59.  
  60. def to_esx(server, username, password):
  61. con = VIServer()
  62. try:
  63. logging.debug('Trying to connect with provided credentials')
  64. con.connect(server, username, password)
  65. logging.info('Connected to server %s' % server)
  66. logging.debug('Server type: %s' % con.get_server_type())
  67. logging.debug('API version: %s' % con.get_api_version())
  68. except VIException as ins:
  69. logging.error(ins)
  70. logging.debug('Loggin error. Program will exit now.')
  71. sys.exit()
  72. return con
  73.  
  74.  
  75. def remove_vm(vm, con):
  76. #Invoke Destroy_Task
  77. request = VI.Destroy_TaskRequestMsg()
  78. _this = request.new__this(vm._mor)
  79. _this.set_attribute_type(vm._mor.get_attribute_type())
  80. request.set_element__this(_this)
  81. ret = con._proxy.Destroy_Task(request)._returnval
  82. task = VITask(ret, con)
  83. #Wait for the task to finish
  84. status = task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR])
  85. if status == task.STATE_SUCCESS:
  86. print "VM successfully unregistered and deleted from datastore"
  87. elif status == task.STATE_ERROR:
  88. print "Error removing vm:", task.get_error_message()
  89.  
  90. def get_args(): # pragma: no cover
  91. # Creating the argument parser
  92. parser = argparse.ArgumentParser(
  93. description="Getting info of VM.")
  94. parser.add_argument(
  95. '-s',
  96. '--server',
  97. nargs=1,
  98. required=True,
  99. help='The vCenter or ESXi server to connect to',
  100. dest='server',
  101. type=str)
  102. parser.add_argument(
  103. '-u',
  104. '--user',
  105. nargs=1,
  106. required=True,
  107. help='The username with which to connect to the server',
  108. dest='username',
  109. type=str)
  110. parser.add_argument(
  111. '-p',
  112. '--password',
  113. nargs=1,
  114. required=False,
  115. help='The password in plain text with which to connect to the host. If not specified, the user is prompted at runtime for a password.',
  116. dest='password',
  117. type=str)
  118. parser.add_argument(
  119. '-pe',
  120. '--password-encrypted',
  121. nargs=1,
  122. required=False,
  123. help='The password encrypted using Base64 with which to connect to the host. ',
  124. dest='passwordEncrypted',
  125. type=str)
  126. parser.add_argument(
  127. '-m',
  128. '--vm',
  129. nargs=1,
  130. required=True,
  131. help='The virtual machine (VM)',
  132. dest='vmname',
  133. type=str)
  134. parser.add_argument(
  135. '-v',
  136. '--verbose',
  137. required=False,
  138. help='Enable verbose output',
  139. dest='verbose',
  140. action='store_true')
  141. parser.add_argument(
  142. '-d',
  143. '--debug',
  144. required=False,
  145. help='Enable debug output',
  146. dest='debug',
  147. action='store_true')
  148. parser.add_argument(
  149. '-l',
  150. '--log-file',
  151. nargs=1,
  152. required=False,
  153. help='File to log to (default = stdout)',
  154. dest='logfile',
  155. type=str)
  156.  
  157. parser.add_argument(
  158. '-V',
  159. '--version',
  160. action='version',
  161. version="%(prog)s (version 0.1)")
  162.  
  163. # subparsers = parser.add_subparsers(help='commands')
  164. args = parser.parse_args()
  165. return args
  166.  
  167.  
  168. def run(): # pragma: no cover
  169. # Notification settings
  170. args = get_args()
  171. # argsdict = vars(args)
  172. server = args.server[0]
  173. username = args.username[0]
  174. vmname = args.vmname[0]
  175. verbose = args.verbose
  176. debug = args.debug
  177. log_file = None
  178. password = None
  179.  
  180. if args.password:
  181. password = args.password[0]
  182. if args.logfile:
  183. log_file = args.logfile[0]
  184.  
  185. # Logging settings
  186. if debug:
  187. log_level = logging.DEBUG
  188. elif verbose:
  189. log_level = logging.INFO
  190. else:
  191. log_level = logging.WARNING
  192.  
  193. #Initializing logger
  194. if log_file:
  195. logging.basicConfig(
  196. filename=log_file,
  197. format='%(asctime)s %(levelname)s %(message)s',
  198. level=log_level)
  199. else:
  200. logging.basicConfig(
  201.  
  202. format='%(asctime)s %(levelname)s %(message)s',
  203. level=log_level)
  204.  
  205. logger = logging.getLogger(__name__)
  206. logger.debug('logger initialized')
  207. try:
  208. logger.debug('Using encrypted password. Decrypting now.')
  209. if args.passwordEncrypted:
  210. password = base64.b64decode(args.passwordEncrypted[0])
  211. except Exception as error:
  212. logger.error(error)
  213. logger.debug(
  214. 'Password error. Either this is not an encrypted passowrd or is not well formated.')
  215. sys.exit()
  216.  
  217. # Asking Users password for server
  218. if password is None:
  219. logger.debug(
  220. 'No command line password received, requesting plain text password from user.')
  221. password = getpass.getpass(
  222. prompt='Enter password for vCenter %s for user %s: ' %
  223. (server, username))
  224. # Connecting to server
  225. logger.info('Connecting to server %s with username %s' % (server, username))
  226. con = to_esx(
  227. server=server,
  228. username=username,
  229. password=password)
  230. try:
  231. # Getting VM object
  232. vms = get_vm_by_name_started_with(vmname, con)
  233. for vm in vms:
  234. # if vm:
  235. # logger.info(
  236. # 'Successfully found %s in %s' %
  237. # (vm.get_property('name'), vm.get_property('path')))
  238. vmname = vm.properties.name
  239. if not vm.is_powered_off():
  240. try:
  241. vm.power_off()
  242. try:
  243. while not vm.is_powered_off():
  244. time.sleep(1)
  245. except Exception as error:
  246. print "!!!!!!!!!!!!Catched ERROR %s " % error
  247.  
  248. except Exception as error:
  249. logger.error(error)
  250. con.disconnect()
  251. sys.exit(127)
  252. print "VM '%s' is shutted down " % vmname
  253. remove_vm(vm, con)
  254. con.disconnect()
  255. except VIException as inst:
  256. logger.error(inst)
  257. logger.error('An unexpceted error ocurred. Program will be terminated.')
  258. sys.exit(127)
  259.  
  260. if __name__ == '__main__': # pragma: no cover
  261. run()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement