Ejemplo n.º 1
0
    def vmaction(self, vm_name, vm_hz):

        server_obj = VIServer()
        try:
            server_obj.connect(self.host_ip, self.user, self.password)
        except Exception as e:
            print e

        # 通过名称获取vm的实例
        try:
            vm = server_obj.get_vm_by_name(vm_name)
        except Exception as e:
            return 0
        if vm.is_powered_off() == False:
            try:
                vm.reset()
                # print (type(int(vm_hz)))
                for i in range(1, int(vm_hz)):
                    print u'虚拟机%s 正在重置中。。。。,请等待注册\n' % (vm_name)
                    time.sleep(1)
                print u'重置完成'
                server_obj.disconnect()

                return 1
            except Exception as e:
                print e

        if vm.is_powered_off() == True:
            try:
                vm.power_on()
                print u'虚拟机%s 正在开机中。。。。' % (vm_name)
                server_obj.disconnect()

            except Exception as e:
                return 2
Ejemplo n.º 2
0
def main(argv=None):

    if argv is None:
    argv = sys.argv

    server = VIServer()
    server.connect(sys.argv[1], sys.argv[2], sys.argv[3])

    print "{"
    print "\t\"data\":[\n"
    first = 1

    for ds_mor, name in server.get_datastores().items():
        props = VIProperty(server, ds_mor)
    if not first:
        sys.stdout.write(",")
    first = 0

    pfree = float(props.summary.freeSpace) / float(props.summary.capacity) * 100

    print "\n\t{"
        print "\t\t\"{#DSNAME}\":\"%s\"," % name
        print "\t\t\"{#DSACCESS}\":\"%d\"," % props.summary.accessible
        print "\t\t\"{#DSCAP}\":\"%s\"," % props.summary.capacity
        print "\t\t\"{#DSFREE}\":\"%s\"," % props.summary.freeSpace
        print "\t\t\"{#DSPFREE}\":\"%s\"" % pfree
        sys.stdout.write("\t}") 

    print "\n\t]"
    print "}"

    server.disconnect()
Ejemplo n.º 3
0
def vmwareplugin_datastores(request):
    from pysphere import VIServer
    data = {
        'error': False,
    }
    if request.POST.get('oid'):
        vmware = models.VMWarePlugin.objects.get(id=request.POST.get('oid'))
    else:
        vmware = None
    try:
        if request.POST.get('password'):
            password = request.POST.get('password')
        elif not request.POST.get('password') and vmware:
            password = vmware.get_password()
        else:
            password = ''
        server = VIServer()
        server.connect(
            request.POST.get('hostname'),
            request.POST.get('username'),
            password,
            sock_timeout=7,
        )
        data['value'] = server.get_datastores().values()
        server.disconnect()
    except Exception, e:
        data['error'] = True
        data['errmsg'] = unicode(e).encode('utf8')
Ejemplo n.º 4
0
def vmwareplugin_datastores(request):
    from pysphere import VIServer
    data = {
        'error': False,
    }
    if request.POST.get('oid'):
        vmware = models.VMWarePlugin.objects.get(id=request.POST.get('oid'))
    else:
        vmware = None
    try:
        if request.POST.get('password'):
            password = request.POST.get('password')
        elif not request.POST.get('password') and vmware:
            password = vmware.get_password()
        else:
            password = ''
        server = VIServer()
        server.connect(
            request.POST.get('hostname'),
            request.POST.get('username'),
            password,
            sock_timeout=7,
        )
        data['value'] = server.get_datastores().values()
        server.disconnect()
    except Exception, e:
        data['error'] = True
        data['errmsg'] = unicode(e).encode('utf8')
Ejemplo n.º 5
0
class VSphereConnection(ConnectionUserAndKey):
    def __init__(self, user_id, key, secure=True,
                 host=None, port=None, url=None, timeout=None, **kwargs):
        if host and url:
            raise ValueError('host and url arguments are mutually exclusive')

        if host:
            host_or_url = host
        elif url:
            host_or_url = url
        else:
            raise ValueError('Either "host" or "url" argument must be '
                             'provided')

        self.host_or_url = host_or_url
        self.client = None
        super(VSphereConnection, self).__init__(user_id=user_id,
                                                key=key, secure=secure,
                                                host=host, port=port,
                                                url=url, timeout=timeout,
                                                **kwargs)

    def connect(self):
        self.client = VIServer()

        trace_file = os.environ.get('LIBCLOUD_DEBUG', None)

        try:
            self.client.connect(host=self.host_or_url, user=self.user_id,
                                password=self.key,
                                sock_timeout=DEFAULT_CONNECTION_TIMEOUT,
                                trace_file=trace_file)
        except Exception:
            e = sys.exc_info()[1]
            message = e.message
            if hasattr(e, 'strerror'):
                message = e.strerror
            fault = getattr(e, 'fault', None)

            if fault == 'InvalidLoginFault':
                raise InvalidCredsError(message)
            raise LibcloudError(value=message, driver=self.driver)

        atexit.register(self.disconnect)

    def disconnect(self):
        if not self.client:
            return

        try:
            self.client.disconnect()
        except Exception:
            # Ignore all the disconnect errors
            pass

    def run_client_method(self, method_name, **method_kwargs):
        method = getattr(self.client, method_name, None)
        return method(**method_kwargs)
Ejemplo n.º 6
0
class VSphereConnection(ConnectionUserAndKey):
    def __init__(self, user_id, key, secure=True,
                 host=None, port=None, url=None, timeout=None, **kwargs):
        if host and url:
            raise ValueError('host and url arguments are mutually exclusive')

        if host:
            host_or_url = host
        elif url:
            host_or_url = url
        else:
            raise ValueError('Either "host" or "url" argument must be '
                             'provided')

        self.host_or_url = host_or_url
        self.client = None
        super(VSphereConnection, self).__init__(user_id=user_id,
                                                key=key, secure=secure,
                                                host=host, port=port,
                                                url=url, timeout=timeout,
                                                **kwargs)

    def connect(self):
        self.client = VIServer()

        trace_file = os.environ.get('LIBCLOUD_DEBUG', None)

        try:
            self.client.connect(host=self.host_or_url, user=self.user_id,
                                password=self.key,
                                sock_timeout=DEFAULT_CONNECTION_TIMEOUT,
                                trace_file=trace_file)
        except Exception as e:
            message = e.message
            if hasattr(e, 'strerror'):
                message = getattr(e, 'strerror', e.message)

            fault = getattr(e, 'fault', None)

            if fault == 'InvalidLoginFault':
                raise InvalidCredsError(message)
            raise LibcloudError(value=message, driver=self.driver)

        atexit.register(self.disconnect)

    def disconnect(self):
        if not self.client:
            return

        try:
            self.client.disconnect()
        except Exception:
            # Ignore all the disconnect errors
            pass

    def run_client_method(self, method_name, **method_kwargs):
        method = getattr(self.client, method_name, None)
        return method(**method_kwargs)
Ejemplo n.º 7
0
 def test_vmware_version_vcenter(self):
     """ Is the Vmware version at 5.1?"""
     server = VIServer()
     server.connect(CREDS.get('Vcenter', 'server'),
                    CREDS.get('Vcenter', 'user'),
                    CREDS.get('Vcenter', 'pass'))
     api = server.get_api_version()
     self.assertEqual('5.1', api)
     server.disconnect()
Ejemplo n.º 8
0
 def test_vmware_version_vcenter(self):
     """ Is the Vmware version at 5.1?"""
     server = VIServer()
     server.connect(CREDS.get('Vcenter', 'server'),
                    CREDS.get('Vcenter', 'user'),
                    CREDS.get('Vcenter', 'pass'))
     api = server.get_api_version()
     self.assertEqual('5.1', api)
     server.disconnect()
Ejemplo n.º 9
0
 def esxi_version(self):
     server_obj = VIServer()
     try:
         server_obj.connect(self.host_ip, self.user,  self.password)
         servertype, version = server_obj.get_server_type(),server_obj.get_api_version()
         server_obj.disconnect()
         return servertype, version
     except Exception as  e:
         print e
Ejemplo n.º 10
0
def main():
    opts = options()

    # CONNECTION PARAMTERS
    server = opts.esx_host
    user = opts.user
    password = opts.passwd

    # REQUIRED PARAMETERS
    vmname = opts.name

    # CONNECT TO THE SERVER
    s = VIServer()
    s.connect(server, user, password)

    try:
        vm = s.get_vm_by_name(opts.name)
        vm.shutdown_guest()
        
        count = 1
        wait_for = 60
        try: 
            while count < wait_for and vm.is_powered_off() == False:
                count += 1
                time.sleep(1)
                print "Elapsed %s seconds ..." % str(count)

        except Exception as e:
            if count >= wait_for:
                print "Failed to shutdown the VM (%s) even after %s seconds." % (vmname, str(wait_for))
                print "Please login to the EXSi server and fix the issue. Exception: %s" % str(e)
                sys.exit(1)

        check_count(count, wait_for)
    except Exception as e:
        print "Failed to locate and shutdown the new VM using:", opts.name
        print "VM could not be deleted."
        print "Exception:", str(e)

    # Invoke Destroy_Task
    request = VI.Destroy_TaskRequestMsg()
    _this = request.new__this(vm._mor)
    _this.set_attribute_type(vm._mor.get_attribute_type())
    request.set_element__this(_this)
    ret = s._proxy.Destroy_Task(request)._returnval

    # Wait for the task to finish
    task = VITask(ret, s)

    status = task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR])
    if status == task.STATE_SUCCESS:
        print "VM successfully deleted from disk"
    elif status == task.STATE_ERROR:
        print "Error removing vm:", task.get_error_message()

    # disconnect from the server
    s.disconnect()
Ejemplo n.º 11
0
def main():
    opts = options()

    # CONNECTION PARAMTERS
    server = opts.esx_host
    user = opts.user
    password = opts.passwd

    # REQUIRED PARAMETERS
    vmname = opts.name
    template = opts.template
    cd_iso_location = opts.iso

    datastorename = opts.datastore  # if None, will use the first datastore available

    # CONNECT TO THE SERVER
    s = VIServer()
    s.connect(server, user, password)

    # Clone the VM.
    try:
        template_vm = s.get_vm_by_name(template)
    except Exception as e:
        print "Failed to locate the template."
        print "Exception:", str(e)
        sys.exit(1)

    vm = template_vm.clone(vmname, power_on=False)
    cdrom = None

    for dev in vm.properties.config.hardware.device:
        if dev._type == "VirtualCdrom":
            cdrom = dev._obj
            break

    change_cdrom_type(cdrom, "ISO", "[%s] %s" % (datastorename, cd_iso_location))
    apply_changes(vm, s, cdrom)

    # Here you should power your VM (refer to the pysphere documentation)
    # So it boots from the specified ISO location
    try:
        new_vm = s.get_vm_by_name(opts.name)
        connect_vm_cdroms(new_vm, s)
        try:
            new_vm.power_on()
        except Exception as e:
            print "Failed to power-on the new VM using:", opts.name
            print "Exception:", str(e)
    except Exception as e:
        print "Failed to locate the new VM using:", opts.name
        print "Exception:", str(e)
    # disconnect from the server
    s.disconnect()
Ejemplo n.º 12
0
    def vm_status(self, vm_name):

        server_obj = VIServer()
        try:
            server_obj.connect(self.host_ip, self.user, self.password)
            # servertype, version = server_obj.get_server_type(),server_obj.get_api_version()

        except Exception as e:
            server_obj.disconnect()
            print e

        # 通过名称获取vm的实例
        try:
            vm = server_obj.get_vm_by_name(vm_name)
            if vm.is_powered_off() == False:
                server_obj.disconnect()
                return 1

            if vm.is_powered_off() == True:
                server_obj.disconnect()
                return 2

        except Exception as e:
            server_obj.disconnect()
            return 3
Ejemplo n.º 13
0
    def vm_status(self, vm_name):
        m = Info_log(time.strftime('%Y-%m-%d', time.localtime(time.time())))
        log = m.log()
        server_obj = VIServer()
        try:
            server_obj.connect(self.host_ip, self.user, self.password)
            # servertype, version = server_obj.get_server_type(),server_obj.get_api_version()

        except Exception as e:
            server_obj.disconnect()
            log.info(e)

        # 通过名称获取vm的实例
        try:
            vm = server_obj.get_vm_by_name(vm_name)
            if vm.is_powered_off() == False:
                server_obj.disconnect()
                return 1

            if vm.is_powered_off() == True:
                server_obj.disconnect()
                return 2

        except Exception as e:
            server_obj.disconnect()
            return 3
Ejemplo n.º 14
0
def main():
    DisableSSL()
    server = VIServer()
    server.connect(vCenterIP, username, password)
    hostslist = server.get_hosts().values()
    # print hostslist

    f = open("hosts.txt", "w")
    sep = "\n"
    f.write(sep.join(hostslist))
    f.close()

    #Disconnecting from the server
    server.disconnect()
Ejemplo n.º 15
0
def main():
    DisableSSL()
    server = VIServer()
    server.connect(vCenterIP,username,password)
    hostslist = server.get_hosts().values()
    # print hostslist

    f = open("hosts.txt","w")
    sep = "\n"
    f.write(sep.join(hostslist))
    f.close()

    #Disconnecting from the server
    server.disconnect()
Ejemplo n.º 16
0
def vi_retrieve_host_objects(host,properties):
    s = VIServer()
    s.connect(vi_configuration["VI_HOST"], vi_configuration["VI_USER"], vi_configuration["VI_PASS"])

    # If we can't find this host in the get_hosts() output then it doesn't exist
    # on this vCenter. We catch this with an indexError and return false to be
    # detected upstream. Can we do this quicker? Takes ~2s to retrieve the hosts
    # on a loaded 4.1 vCenter.
    try:
        from_host = [k for k,v in s.get_hosts().items() if v == host][0]
        result = s._retrieve_properties_traversal(property_names=properties,from_node=from_host,obj_type=MORTypes.HostSystem)[0]
    except IndexError:
        result = False
    s.disconnect()
    return result
Ejemplo n.º 17
0
    def esxi_version(self):

        m = Info_log(time.strftime('%Y-%m-%d', time.localtime(time.time())))
        log = m.log()
        server_obj = VIServer()
        try:
            server_obj.connect(self.host_ip, self.user, self.password)
            servertype, version = server_obj.get_server_type(
            ), server_obj.get_api_version()
            server_obj.disconnect()
            return servertype, version, self.flag
        except Exception as e:
            server_obj.disconnect()

            log.info(e)
Ejemplo n.º 18
0
class Server:
        def __init__(self):
                self.server = VIServer()
                self.connect()

        def connect(self):
                try:
                        # monkey-patch SSL module (uncomment if unneeded)
                        #ssl._create_default_https_context = ssl._create_unverified_context
                        self.server.connect('vsphere-host', 'user', 'password')
                except Exception as e:
                        return str(e)
                return False

        def disconnect(self):
                self.server.disconnect()
def set_ip_via_vsphere(vm_name, fqdn):
  #Connect to vSphere
  server = VIServer()
  server.connect(settings.VSPHERE_HOSTNAME, settings.VSPHERE_USERNAME, settings.VSPHERE_PASSWORD)

  #Connect to the new vm.  Call the object vm1
  vm1 = server.get_vm_by_name(vm_name)
  vm1.login_in_guest(settings.VSPHERE_TEMPLATE_USERNAME, settings.VSPHERE_TEMPLATE_PASSWORD)

  #login and set the IP and restart networking to get it on the air
  vm1.send_file(settings.TEMP_LOCATION_CONFIG_NETWORK.format(fqdn=fqdn), '/etc/sysconfig/network', overwrite=True)
  vm1.send_file(settings.TEMP_LOCATION_CONFIG_ETH0.format(fqdn=fqdn), '/etc/sysconfig/network-scripts/ifcfg-eth0', overwrite=True)
  vm1.start_process("/sbin/service", args=["network", "restart"])
  vm1.start_process("/bin/hostname", args=[fqdn])

  #disconnect from vSphere
  server.disconnect()
Ejemplo n.º 20
0
class Server:
	def __init__(self):
		self.server = VIServer()
		self.connect()

	def connect(self):
		try:
			# monkey-patch SSL module (uncomment if unneeded)
			#ssl._create_default_https_context = ssl._create_unverified_context

			self.server.connect(os.getenv("API_ADDRESS"), os.getenv("USER"), os.getenv("PASSWORD"))
		except Exception as e:
			return str(e)
		return False

	def disconnect(self):
		self.server.disconnect()
Ejemplo n.º 21
0
def vm_migrate():
    """Migrate the VMs based on the list given"""
    user, passwd, vcenter = get_user_info()
    host, servers, servercount = get_serverlist()
    s = VIServer()
    s.connect(vcenter, user, passwd)
    getserver_type_api()

    esxhost_input = raw_input('Enter target ESX Host: ')
    esxhost = s.get_hosts().items()
    for k,v in esxhost:
        if v == esxhost_input:
            for host in servers:
                host = host.strip()
                vm = s.get_vm_by_name(host)
                vm.migrate(host=k)
                time.sleep(10)
    s.disconnect()
Ejemplo n.º 22
0
def revert_and_start():
    try:
        for host in get_hosts():
            server = VIServer()
            server.connect(host.ip, host.user, host.pwd)
            
            for vm_path in host.vms:
                try:
                    vm = server.get_vm_by_path(vm_path.strip())
                    vm.revert_to_snapshot()
                    if not vm.is_powered_on():
                        vm.power_on()
                except Exception, e:
                    print "[ERROR] Error happened when revert and start test lab %s" % vm_path
                    print e

            server.disconnect()
    except Exception, e:
        print "[ERROR] Error happened when prepare test enviroment(revert and start test labs)."
        print e
Ejemplo n.º 23
0
def revert_and_start():
    try:
        for host in get_hosts():
            server = VIServer()
            server.connect(host.ip, host.user, host.pwd)
            
            for vm_path in host.vms:
                try:
                    vm = server.get_vm_by_path(vm_path.strip())
                    vm.revert_to_snapshot()
                    if not vm.is_powered_on():
                        vm.power_on()
                except Exception, e:
                    print "[ERROR] Error happened when revert and start test lab %s" % vm_path
                    print e

            server.disconnect()
    except Exception, e:
        print "[ERROR] Error happened when prepare test enviroment(revert and start test labs)."
        print e
Ejemplo n.º 24
0
def get_datastore_info(host_ip,host_name,host_password):
    stats_data_list = []

    s = VIServer()
    s.connect(host_ip, host_name, host_password)
    print 'VC connect successful...'

    for ds, dsname in s.get_datastores().items():
        DatastoreCapacity = 0
        DatastoreFreespace = 0
        DatastoreUsagePercent = 0

        props = s._retrieve_properties_traversal(property_names=['name', 'summary.capacity', 'summary.freeSpace'],
                                                 from_node=ds, obj_type="Datastore")
        # print props
        for prop_set in props:
            for prop in prop_set.PropSet:
                if prop.Name == "summary.capacity":
                    DatastoreCapacity = round((prop.Val / 1073741824),2)
                elif prop.Name == "summary.freeSpace":
                    DatastoreFreespace = round((prop.Val / 1073741824),2)

        UsedSpace = round((DatastoreCapacity - DatastoreFreespace),2)
        DatastoreUsagePercent = round((((DatastoreCapacity - DatastoreFreespace) * 100) / DatastoreCapacity),2)

        metricnameZoneDatastoreCapacity = dsname.lower() + 'Capacity'
        metricnameZoneDatastoreFreespace = dsname.lower() + 'FreeSpace'
        metricnameZoneDatastoreUsagePercent = dsname.lower() + 'UsagePercent'

        volumes_dict = {'volumes': dsname.lower(), 'FreeSpace': DatastoreFreespace, 'UsedSpace': UsedSpace,
                        'capacity': DatastoreCapacity, 'usagePercent': DatastoreUsagePercent}
        #pprint.pprint(volumes_dict)
        #DebugInfo.objects.create(text_info=volumes_dict)
        stats_data_list.append(volumes_dict)

    #print 'mVC disconnect successful...'

    s.disconnect()
    return stats_data_list
Ejemplo n.º 25
0
class vSphere:
    hostname = ""
    username = ""
    password = ""

    def __init__(self, vm_path):
        self.vm_path = vm_path

    def __enter__(self):
        self.server = VIServer()
        self.server.connect(self.hostname, self.username, self.password)
        print "DBG connect"
        vm = self.server.get_vm_by_path(self.vm_path)
        return vm

    def __exit__(self, type, value, traceback):
        try:
            self.server.disconnect()
            print "DBG disconnect"
        except VIException as e:
            print "DBG problem in disconnection. Fault is: %s" % e.fault
            pass
Ejemplo n.º 26
0
def main():
    if len(sys.argv) <> 3:
        print ("Usage:")
        print (sys.argv[0], "<username> <password")

    username = sys.argv[1]
    password = sys.argv[2]

    vcenter = "ecnshmw1001.sh.cn.ao.ericsson.se"


    server = VIServer()
    server.connect( vcenter, username, password )
    print ("Login .....")
    type = server.get_api_type()
    version = server.get_api_version()

    print ("You are now connecting with {0} with API version {1}".format(type, version))


    select(server)
    server.disconnect()
Ejemplo n.º 27
0
class vSphere:
    hostname = ""
    username = ""
    password = ""

    def __init__(self, vm_path):
        self.vm_path = vm_path

    def __enter__(self):
        self.server   = VIServer()
        self.server.connect(self.hostname, self.username, self.password)
        print "DBG connect"
        vm  = self.server.get_vm_by_path(self.vm_path)
        return vm

    def __exit__(self, type, value, traceback):
        try:
            self.server.disconnect()
            print "DBG disconnect"
        except VIException as e:
            print "DBG problem in disconnection. Fault is: %s" % e.fault
            pass
Ejemplo n.º 28
0
    def vmaction(self, vm_name):

        server_obj = VIServer()
        try:
            server_obj.connect(self.host_ip, self.user, self.password)
        except Exception as e:
            print(e)

        # 通过名称获取vm的实例
        try:
            vm = server_obj.get_vm_by_name(vm_name)
        except Exception as e:
            print(e)
            return 0
        if vm.is_powered_off() == False:
            try:
                vm.reset()
                # vm.power_off()

                # print (type(int(vm_hz)))
                # for i in range(1, int(vm_hz)):
                #     print (f'虚拟机{vm_name} 正在重置中。。。。,请等待注册\n' )
                #     time.sleep(1)
                # print ('重置完成')
                server_obj.disconnect()

                return 1
            except Exception as e:
                print(e)

        if vm.is_powered_off() == True:
            try:
                # vm.power_on()
                # print (f'虚拟机{vm_name} 正在开机中。。。。')
                server_obj.disconnect()

            except Exception as e:
                return 2
Ejemplo n.º 29
0
class vSphere:
    def __init__(self, vm_path, sdk_host, sdk_user, sdk_domain, sdk_passwd):
        self.vm_path = vm_path
        self.sdk_host = sdk_host
        self.sdk_user = sdk_domain + "\\" + sdk_user
        self.sdk_passwd = sdk_passwd

    def __enter__(self):
        self.server = VIServer()
        self.server.connect(self.sdk_host, self.sdk_user, self.sdk_passwd)
        if config.verbose:
            logging.debug("connected to vSphere")
        vm = self.server.get_vm_by_path(self.vm_path)
        return vm

    def __exit__(self, type, value, traceback):
        try:
            self.server.disconnect()
            if config.verbose:
                logging.debug("disconnected from vSphere")
        except VIException as e:
            logging.debug("Problem in disconnection. Fault is: %s" % e.fault)
            pass
Ejemplo n.º 30
0
class EsxiServer:
    server_ip = ''
    user_name = ''
    password = ''
    connect_flag = False
    server = None

    def opearte_guest_power(self, src_vm_name, operate):
        """"
       |##desc: 操作客户机电源(重启、关机、开机),这种模式不需要vmtools,就是强制操作电源,不走操作系统 ,可能损坏数据
       |##:param: >vm1.power_on()
                        >vm1.reset()
                        >vm1.suspend() #since pysphere 0.1.5
                        >vm1.power_off()
       |##:return: None
       |##@author: jhuang
       |##@time:12/12/2017
       """
        ovm = self.server.get_vm_by_name(src_vm_name)

        if operate == 'power_on':
            ovm.power_on()
            return True
        elif operate == 'reset':
            ovm.reset()
            return True
        elif operate == 'suspend':
            ovm.suspend()
            return True
        elif operate == 'power_off':
            ovm.power_off()
            return True
        else:
            print "Operate guest error: operate can noly be set as power_on, reset, suspend, power_off"
            return False

    def clone(self, src_vm_name, dest_vm_name, datacenter=None, sync_run=True, folder=None, resourcepool=None,
              datastore=None, host=None, power_on=True, template=False,
              snapshot=None, linked=False):
        """
        |##desc: 克隆虚拟机
        |##:param: None
        |##:return: None
        |##@author: jhuang
        |##@time:12/12/2017
        """
        # get_vm_by_name 在包含2个数据中心的情况下,需要指定参数  datacenter 其中的限定条件为datacenter
        # vm1 = server.get_vm_by_path("[DataStore1] Ubantu/Ubantu-10.vmx") 通过路径方法获取对象
        logger.debug(src_vm_name)
        logger.debug(datacenter)
        ovm = self.server.get_vm_by_name(src_vm_name, datacenter)
        new_vm = ovm.clone(dest_vm_name)

    def create_snapshot(self, src_vm_name, snapShotName):
        """
        |##desc: 创建快照
        |##:param: None
        |##:return: None
        |##@author: jhuang
        |##@time:12/12/2017
        """
        ovm = self.server.get_vm_by_name(src_vm_name)
        ovm.create_snapshot(snapShotName)

    def set_ssl_no_verify(self):
        ssl._create_default_https_context = ssl._create_unverified_context

    # Use the given args to connect the esxi server you want
    # @ip[string]: ESXi server's IP address
    # @name[string]: the username used to login the ESXi server
    # @pwd[string]: the password used to login the ESXi server
    def connect_server(self, ip, name, pwd, ssl_no_verify=True):
        logger.debug(ip)
        logger.debug(name)
        logger.debug(pwd)
        self.server_ip = ip
        self.user_name = name
        self.password = pwd
        self.server = VIServer()
        if ssl_no_verify:
            self.set_ssl_no_verify()
        self.server.connect(self.server_ip, self.user_name, self.password)
        self.connect_flag = self.server.is_connected()
        if self.connect_flag:
            return True
        return False

    # To get all the definition registered vms from the connected server
    # @param[string]: can be set as ALL, POWER_ON, POWER_OFF, SUSPENDED
    # According to the param, returns a list of VM Paths. You might also filter by datacenter,
    # cluster, or resource pool by providing their name or MORs.
    # if  cluster is set, datacenter is ignored, and if resource pool is set
    # both, datacenter and cluster are ignored.
    def get_registered_vms(self, param='ALL', status=None, datacenter=None, cluster=None,
                           resource_pool=None):
        """
        获取注册的主机 (虚拟机)

        :param param1: this is a first param
        :param param2: this is a second param
        :returns: this is a description of what is returned
        :raises keyError: raises an exception
        @author: jhuang
        @time:28/02/2018
        """
        if param not in ['ALL', 'POWER_ON', 'POWER_OFF', 'SUSPENDED']:
            print "Get VMs error: param can only be set as ALL, POWER_ON, POWER_OFF, or SUSPENDED."
            return None
        if self.connect_flag == False:
            print "Get VMs error: Server not connected."
            return None
        if param == 'ALL':
            return self.server.get_registered_vms(datacenter, cluster, resource_pool)
        elif param == 'POWER_ON':
            return self.server.get_registered_vms(datacenter, cluster, resource_pool, status='poweredOn')
        elif param == 'POWER_OFF':
            return self.server.get_registered_vms(datacenter, cluster, resource_pool, status='poweredOff')
        elif param == 'SUSPENDED':
            return self.server.get_registered_vms(datacenter, cluster, resource_pool, status='suspended')
        else:
            return None

    # Disconnect to the Server
    def disconnect(self):
        if self.connect_flag is True:
            self.server = self.server.disconnect()
            self.connect_flag == False

    # To keep session alive
    def keep_session_alive(self):
        assert self.server.keep_session_alive()

    # To get the server type
    def get_server_type(self):
        return self.server.get_server_type()

    # To get performance manager
    def get_performance_manager(self):
        return self.server.get_performance_manager()

    # To get the all the server's hosts
    def get_all_hosts(self):
        """
        获取所有主机(这个是宿主机)
        Returns a dictionary of the existing hosts keys are their names
        and values their ManagedObjectReference object.
        """
        return self.server.get_hosts()

    # To get all datastores
    def get_all_datastores(self):
        """
        获取存储列表
        Returns a dictionary of the existing datastores. Keys are
        ManagedObjectReference and values datastore names.
        """
        return self.server.get_datastores()

    # To get all clusters
    def get_all_clusters(self):
        """
        获取所有集群列表
        Returns a dictionary of the existing clusters. Keys are their
        ManagedObjectReference objects and values their names.
        """
        return self.server.get_clusters()

    # To get all datacenters
    def get_all_datacenters(self):
        """
        获取数据中心列表
        Returns a dictionary of the existing datacenters. keys are their
        ManagedObjectReference objects and values their names.
        """
        return self.server.get_datacenters()

    # To get all resource pools
    def get_all_resource_pools(self):
        """
        Returns a dictionary of the existing ResourcePools. keys are their
        ManagedObjectReference objects and values their full path names.
        """
        return self.server.get_resource_pools()

    # To get hosts by name
    def get_hosts_by_name(self, from_mor):
        """
        Returns a dictionary of the existing ResourcePools. keys are their
        ManagedObjectReference objects and values their full path names.
        @from_mor: if given, retrieves the hosts contained within the specified
            managed entity.
        """
        try:
            hosts_dic = self.server.get_hosts(from_mor)
        except:
            print "Get hosts error!"
            return None
        return hosts_dic
Ejemplo n.º 31
0
class Server:
    """Vsphere server that a client can connect to"""

    SUPPORTED_FILTER_KEYWORDS = ["uuidSpec", "pathSpec", "nameSpec"]

    url = os.getenv("VSPHERE_URL")
    """URL of vSphere endpoint"""

    # : vSphere account username
    username = os.getenv("VSPHERE_USER")

    # : vSphere account password
    password = os.getenv("VSPHERE_PASSWORD")

    def __init__(self, url=None, username=None, password=None):
        """Constructs an Server instance with given endpoint and credentials
        
        :param url: end point hostname/URL to connect to.
           As of this release, url must be an http url with port 80, e.g.
           like this: http://vsphere.example.com
           
        :param username: vSphere account username
        :param password: vSphere account password
        
        """
        self._server = VIServer()
        self._vm_datacenters = {}

        # don't set to None if already set from environment
        if url:
            self.url = url
        if username:
            self.username = username
        if password:
            self.password = password

    def connect(self, url=None, username=None, password=None):
        """Connects to vSphere server using optional arguments
         that may override those in Server constructor.
        If arguments are not given, previously specified arguments will
        be used for connection in this order:
        
        * last connect arguments (if specified)
        * constructor arguments (if specified)
        * environment variables
        
        If none of the above is specified, the exception MissingArgumentException
        is raised
        
        
        :type url: string
        :param url: end point hostname/URL to connect to
        :type username: string
        :param username: vSphere account username
        :type password: string
        :param password: vSphere account password
        :type password: string
        :param password: vSphere account password
        
        """
        if url:
            self.url = url
        if username:
            self.username = username
        if password:
            self.password = password

        # check if all needed properties available for connect
        argErrors = []
        if not self.url:
            argErrors.append("url unknown")
        if not self.username:
            argErrors.append("username unknown")
        if not self.password:
            argErrors.append("password unknown")

        if argErrors:
            raise MissingArgumentError(" ".join(argErrors))
        # parse host from url
        host = urlparse(self.url).hostname
        # perform connect
        logger.debug("connect: %s; %s" % (url, username))
        self._server.connect(host, self.username, self.password, trace_file=prototrace_file)

    def disconnect(self):
        """Disconnects from vSphere server"""
        self._server.disconnect()
        self._server = []

    def power_on_vm(self, instanceUuid, sync_run=True, host=None):
        """Powers on a virtual machine for a given instanceUuid"""
        return self._get_instance(instanceUuid).power_on(sync_run, host)

    def power_off_vm(self, instanceUuid, sync_run=True):
        """Powers off a virtual machine for a given instanceUuid"""
        return self._get_instance(instanceUuid).power_off(sync_run)

    def clone_vm(self, instanceUuid, name=None, sync_run=True, host=None):
        """Clones a virtual machine for a given instanceUuid.
        
        :param instanceUuid: instanceUuid of VM to clone
        :param name: name to give to the cloned machine.
         if None, a new name will be generated using the original instance
         name with time stamp appended, e.g.:
         'ubuntu_csk1_08-1349968939'
         
        """
        import time

        instance = self._get_instance(instanceUuid)
        if not name:
            name = "%s-%d" % (instance.get_property("name"), time.time())
        return instance.clone(name, sync_run, host=host)

    def reset_vm(self, instanceUuid, sync_run=True):
        """Powers off a virtual machine for a given instanceUuid"""
        return self._get_instance(instanceUuid).reset(sync_run)

    def suspend_vm(self, instanceUuid, sync_run=True):
        """Suspends a virtual machine for a given instanceUuid"""
        return self._get_instance(instanceUuid).suspend(sync_run)

    def list_instances(self, instanceUuid=None, filter=None, datacenter=None):
        """Lists all vmware instances that match the given filter.

        :type instanceUuid: string
        :param instanceUuid: InstanceUuid to filter on. This is a convenience
          parameter that will override a corresponding value in filter, 
          if it exists. 
          
        :param datacenter: name of datacenter to filter VMs registered in that datacenter

        :type filter: dict
        :param filter: represents a filter specification and can consist of 
            any valid properties, such as
            
            { 'config.instanceUuid': [ '50398c64-55ad-7eb2-f14a-6f70b6903b06' ] }
            
            or
            
            {'runtime.powerState': ['poweredOn']}
            
            or
            
            {'runtime.powerState': ['poweredOff'], 'config.instanceUuid': [ '50398c64-55ad-7eb2-f14a-6f70b6903b06' ] }
            


        :rtype: list
        :return: A list of :class:`vmware.vsphere.VM`
        
        """

        # get the vm paths
        if instanceUuid and len(instanceUuid):
            if not isinstance(instanceUuid, str):
                raise BadParameterError("instanceUuid parameter must be a string")
            if not filter:
                filter = {}
            filter["config.instanceUuid"] = [instanceUuid]

        self._vmspaths = self._server.get_registered_vms(datacenter, advanced_filters=filter)
        logger.debug("list_instances: retrieved %d vm paths" % len(self._vmspaths))
        # instantiate instances for vm paths
        self.vms = []
        for p in self._vmspaths:
            self.vms.append(VM(p, self))

        # first time this function runs, fetch information about vm to datacenter mapping
        self._fetch_datacenter_vms()
        return self.vms

    def get_hosts(self, datacenter=None):
        """Returns a dictionary of the existing hosts keys are their names
        and values their ManagedObjectReference object.
        
        Example usage:
        >>> server.get_hosts()
        {'host-23': '108.61.71.220', 'host-19': '108.61.71.219', 'host-36': '173.71.195.168'}
        >>> server.get_hosts('datacenter-12')
        >>> from catosphere import Server
        >>> server = Server()
        >>> server.connect()
        >>> server.get_datacenters()
        {'datacenter-12': 'csk3', 'datacenter-2': 'csk1', 'datacenter-7': 'csk2'}
        >>> server.get_hosts('datacenter-2')
        {'host-23': '108.61.71.220', 'host-19': '108.61.71.219'}
        >>> server.get_hosts('datacenter-7')
        {'host-36': '173.71.195.168'}
        >>> server.get_hosts('datacenter-12')
        {}
        >>> server.get_hosts()
        {'host-23': '108.61.71.220', 'host-19': '108.61.71.219', 'host-36': '173.71.195.168'}
        >>> server.disconnect()
        
        
        :return: a dict   
         e.g.
        {'host-23': '108.61.71.220', 'host-19': '108.61.71.219', 'host-36': '173.71.195.168'}
        if not hosts are found, empty dict is returned.

        """
        if datacenter:
            hosts = self._server._get_managed_objects(MORTypes.HostSystem, from_mor=datacenter)
        else:
            hosts = self._server.get_hosts()
        return hosts

    def get_datacenters(self):
        """Returns a dictionary of the existing datacenters. keys are their
        ManagedObjectReference objects and values their names.
                
        :return: a dict   
         e.g.
        {'datacenter-12': 'csk3', 'datacenter-2': 'csk1', 'datacenter-7': 'csk2'}

        """
        return self._server.get_datacenters()

    # ******************************************************
    # ***************** Private Methods *******************
    # ******************************************************

    def _fetch_datacenter_vms(self):
        """ Fetch/cache datacenter vm mapping information.
        
        This can be later used to retrieve datacenter information for each
        VM.
        """
        if not self._vm_datacenters:
            dcs = self.get_datacenters()
            for name in dcs.keys():
                self._vm_datacenters[name] = self._server._get_managed_objects(MORTypes.VirtualMachine, from_mor=name)

            # logger.debug(': _vm_datacenters: %s' % self._vm_datacenters)

    def _get_instance(self, instanceUuid):
        """ Retrieves instance by its instanceUuid.
        
        TODO: make this faster by caching instances.
        """
        instances = self.list_instances(instanceUuid)
        if not instances:
            raise InstanceNotFoundError("Instance %s not found" % instanceUuid)
        else:
            return instances[0]
                found = False
                for p in item.PropSet:
                    if p.Val == expected_uuid:
                        found = True
                        mor = item.Obj
                if found:
                    break
            if not mor:
                print "Object not found"
            else:
                prop = VIProperty(s, mor)
                print prop.name
                print prop.config.instanceUuid
                fetch_data(prop.name, prop.config.instanceUuid, random_string,
                           node, server, vmobj)
            s.disconnect()

    sys.exit(1)

if __name__ == '__main__':
    for vc in range(0, len(my_data)):
        ##### To establish connection with the VCENTER server #####
        if hasattr(ssl, '_create_unverified_context'):
            ssl._create_default_https_context = ssl._create_unverified_context
        conobj = Connect(my_data[vc]['ip'], my_data[vc]['username'],
                         my_data[vc]['password'])
        node = my_data[vc]['node']
        print "Processing node - %s \n" % node
        print "Before connection - Main"
        server = conobj.connectServer()
        print "Got server connection - Main"
Ejemplo n.º 33
0
class Report:
    """Class report. Generate a dictionnary with the VMs and these properties"""
    def __init__(self, config):
        self.login = config['user']
        self.password = config['password']
        self.vcenter = config['vcenter']
        self.server = VIServer()

    def connect(self):
        """Connect to the hypervisor"""
        self.server.connect(self.vcenter, self.login, self.password)

    def disconnect(self):
        """Close the connection with the hypervisor"""
        if self.server:
            self.server.disconnect()

    def generate_report(self):
        """Generate the report of the actual connection"""
        report = []
        # Create the report
        vms_list = self.server.get_registered_vms()
        for vm_path in vms_list:
            virtual_machine = self.server.get_vm_by_path(vm_path)
            if str(virtual_machine.__class__
                   ) != "pysphere.vi_virtual_machine.VIVirtualMachine":
                continue
            if re.match(r'rhel', virtual_machine.get_property('guest_id')):
                vm_infos = {
                    'name': virtual_machine.get_property('name'),
                    'ip': virtual_machine.get_property('ip_address'),
                    'os': virtual_machine.get_property('guest_id')
                }
            try:
                status = virtual_machine.get_status()
            except Exception, e:
                print "Couldn't do it: %s" % e
                vm_infos['powered'] = 'none'
                report.append(vm_infos)
                continue
            if status == "POWERED ON":
                vm_infos['powered'] = 'on'
                # Get version in ssh
                ssh = subprocess.Popen([
                    "ssh", "-i ~/.ssh/id_rsa",
                    "%s" % vm_infos['name'], "cat /etc/redhat-release"
                ],
                                       shell=False,
                                       stdout=subprocess.PIPE,
                                       stderr=subprocess.PIPE)
                release = ssh.stdout.readlines()
                if release == []:
                    error = ssh.stderr.readlines()
                    vm_infos['release'] = "error: " + error
                else:
                    regex = re.compile("release (\d.*).+\(\D*(\d*)\)")
                    r = regex.search(release[0])
                    release = r.groups()
                    if release[1].strip():
                        vm_infos['release'] = release[0] + "." + release[1]
                    else:
                        vm_infos['release'] = release[0]
            else:
                vm_infos['powered'] = 'off'
        report.append(vm_infos)

        return report
Ejemplo n.º 34
0
class Creator:
    # todo; add comment
    """

    """

    def __init__(self, manager_address, manager_user, manager_password):
        """

        :param manager_address:
        :param manager_user:
        :param manager_password:
        """
        self.esx_server = VIServer()
        self.esx_address = manager_address
        self.esx_user = manager_user
        self.esx_password = manager_password

    def __del__(self):
        self._disconnect_from_esx()

    # todo; add comment
    def _connect_to_esx(self):
        """


        :raise:
        """
        if not self.esx_server.is_connected():
            try:
                self.esx_server.connect(self.esx_address, self.esx_user, self.esx_password)
            except Exception as inst:
                raise CreatorException(str(inst))

    def _disconnect_from_esx(self):
        # todo; add comment
        """

        """
        if self.esx_server.is_connected():
            self.esx_server.disconnect()

    def create_resource_pool(
        self,
        name,
        parent_rp="/",
        esx_hostname=None,
        cpu_resources=("normal", 4000, 0, True, -1),
        memory_resources=("normal", 163840, 0, True, -1),
    ):

        """
        Creates a resource pool on esx server
        name - name for new resource pool
        parent_pr - parent resource pool
        esx_hostname - host name of esx server when resource pool will be created
        cpu_resources and memory_resources: tuple
        0:share level - 'low' 'normal' 'high' 'custom'
        1:share value - 'custom' share value, int
        2:reservation - reserved CPU/Memory, int
        3:expandable reservation - bool
        4:limit - -1 - unlimited, another value - limit value, int

        :raise: CreatorException
        """
        self._connect_to_esx()

        if parent_rp == "/":
            parent_rpmor = None
            try:
                rp_mor_temp = [k for k, v in self.esx_server.get_resource_pools().items() if v == "/Resources"]
            except IndexError:
                raise CreatorException("Couldn't find parent resource pool")
            if len(rp_mor_temp) == 0:
                raise CreatorException("Couldn't find parent resource pool")

            if esx_hostname:
                for rp in rp_mor_temp:
                    prop = VIProperty(self.esx_server, rp)
                    if prop.parent.name == esx_hostname:
                        parent_rpmor = rp
                        break
                if not parent_rpmor:
                    raise CreatorException("Couldn't find host")
            else:
                parent_rpmor = rp_mor_temp[0]
        else:
            parent_rp = "/Resources" + parent_rp
            parent_rpmor = None
            try:
                parent_rp_temp = [k for k, v in self.esx_server.get_resource_pools().items() if v == parent_rp]
            except IndexError:
                raise CreatorException("Couldn't find parent a resource pool")
            if len(parent_rp_temp) == 0:
                raise CreatorException("Couldn't find parent a resource pool")
                ##222
            if len(parent_rp_temp) == 1:
                parent_rpmor = parent_rp_temp[0]
            elif esx_hostname:
                for rp in parent_rp_temp:
                    prop = VIProperty(self.esx_server, rp)
                    while prop.parent.name != "host":
                        prop = prop.parent
                        if prop.name == esx_hostname:
                            parent_rpmor = rp
                            break
            else:
                raise CreatorException("ESX Hostname must be specified")

        req = VI.CreateResourcePoolRequestMsg()
        _this = req.new__this(parent_rpmor)
        _this.set_attribute_type(parent_rpmor.get_attribute_type())
        req.set_element__this(_this)

        req.Name = name
        spec = req.new_spec()
        cpu_allocation = spec.new_cpuAllocation()
        memory_allocation = spec.new_memoryAllocation()

        # cpu allocation settings
        shares = cpu_allocation.new_shares()
        shares.Level = cpu_resources[0]
        shares.Shares = cpu_resources[1]
        cpu_allocation.Shares = shares
        cpu_allocation.Reservation = cpu_resources[2]
        cpu_allocation.ExpandableReservation = cpu_resources[3]
        cpu_allocation.Limit = cpu_resources[4]
        spec.CpuAllocation = cpu_allocation

        # memory allocation settings
        shares = memory_allocation.new_shares()
        shares.Level = memory_resources[0]
        shares.Shares = memory_resources[1]
        memory_allocation.Shares = shares
        memory_allocation.Reservation = memory_resources[2]
        memory_allocation.ExpandableReservation = memory_resources[3]
        memory_allocation.Limit = memory_resources[4]
        spec.MemoryAllocation = memory_allocation

        req.Spec = spec
        try:
            self.esx_server._proxy.CreateResourcePool(req)
        except Exception as inst:
            self._disconnect_from_esx()
            inst = str(inst)
            if "already exist" in inst:
                raise ExistenceException("Couldn't create resource pool '%s', because it already exist" % name)
            else:
                raise CreatorException("Couldn't create the resource pool with name '%s'" % name)

    def destroy_resource_pool(self, name, esx_hostname=None):
        """
        Destroy named resource pool; vm included in this pool will be thrown
        on upper resource pool
        :param esx_hostname: host name of esx server, which contains resource pool
        :param name: name of resource pool
        :raise: CreatorException, ExistenceException
        """
        self._connect_to_esx()
        if name[0] != "/":
            rp_name = "/Resources/" + name
        else:
            rp_name = "/Resources" + name

        try:
            rp_mor_temp = [k for k, v in self.esx_server.get_resource_pools().items() if v == rp_name]
        except IndexError:
            raise ExistenceException("Couldn't find resource pool '%s'" % name)

        rpmor = ""
        if esx_hostname:
            for rp in rp_mor_temp:
                prop = VIProperty(self.esx_server, rp)
                while prop.parent.name != "host":
                    prop = prop.parent
                    if prop.name == esx_hostname:
                        rpmor = rp
                        break
        elif len(rp_mor_temp) == 1:
            rpmor = rp_mor_temp[0]
        else:
            raise CreatorException("ESX Hostname must be specified")

        req = VI.Destroy_TaskRequestMsg()
        _this = req.new__this(rpmor)
        _this.set_attribute_type(rpmor.get_attribute_type())
        req.set_element__this(_this)

        try:
            self.esx_server._proxy.Destroy_Task(req)
            # self._disconnect_from_esx()
        except Exception:
            self._disconnect_from_esx()
            raise

    def destroy_resource_pool_with_vms(self, name, esx_hostname=None):
        """
        Destroy named resource pool; vm included in this pool also will be destroyed
        :param name:  name of resource pool
        :param esx_hostname: host name of esx server, which contains resource pool
        :raise: CreatorException, ExistenceException
        """
        self._connect_to_esx()

        if not name:
            raise CreatorException("Couldn't specify resource pool name")

        if name[0] != "/":
            rp_name = "/Resources/" + name
        else:
            rp_name = "/Resources" + name

        try:
            rp_mor_temp = [k for k, v in self.esx_server.get_resource_pools().items() if v == rp_name]
        except IndexError:
            raise CreatorException("Couldn't find resource pool '%s'" % name)

        rpmor = ""
        if esx_hostname:
            for rp in rp_mor_temp:
                prop = VIProperty(self.esx_server, rp)
                while prop.parent.name != "host":
                    prop = prop.parent
                    if prop.name == esx_hostname:
                        rpmor = rp
                        break
        elif len(rp_mor_temp) == 1:
            rpmor = rp_mor_temp[0]
        else:
            raise ExistenceException("Couldn't find resource pool '%s'" % name)

        prop = VIProperty(self.esx_server, rpmor)
        vms = [str(k.name) for k in prop.vm]
        for k in vms:
            self.destroy_vm(k)
        self.destroy_resource_pool(rp_name[10:], esx_hostname)

        # self._disconnect_from_esx()

    def destroy_vm(self, vmname):
        """
        Destroys virtual machine by name
        :param vmname: virtual machine name
        :raise: ExistenceException, CreatorException
        """

        self._connect_to_esx()

        try:
            vm = self.esx_server.get_vm_by_name(vmname)
        except Exception as error:
            self._disconnect_from_esx()
            raise ExistenceException("Couldn't find VM '%s' - %s" % (vmname, error.message))

        try:
            if vm.is_powered_on() or vm.is_powering_off() or vm.is_reverting():
                vm.power_off()
            request = VI.Destroy_TaskRequestMsg()
            _this = request.new__this(vm._mor)
            _this.set_attribute_type(vm._mor.get_attribute_type())
            request.set_element__this(_this)
            ret = self.esx_server._proxy.Destroy_Task(request)._returnval

            # Wait for the task to finish
            task = VITask(ret, self.esx_server)

            status = task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR])
            if status != task.STATE_SUCCESS:
                raise CreatorException("Couldn't destroy vm - " + task.get_error_message())
        except Exception:
            self._disconnect_from_esx()
            raise CreatorException("Couldn't destroy the virtual machine %s" % vmname)

    def create_vm_old(
        self,
        vmname,
        esx_hostname=None,
        iso=None,
        datacenter=None,
        resource_pool="/",
        networks=None,
        datastore=None,
        description=None,
        guestosid="debian4Guest",
        memorysize=512,
        cpucount=1,
        disk_space=1048576,
    ):
        """
        Creates virtual machine
        :param vmname: name of virtual machine
        :param esx_hostname: host's name, when vm will be created; if not specified
                       and ESX contains more than 1 hosts - raise CreatorException
        :param iso: path to .ISO image; must be stored in the same datastore
              as the virtual machine is created
        :param datacenter: name of datacenter, which contain hosts and datastores
        :param resource_pool: name of resource pool, when VM will be created
            (e.g. win-servers/win2003)
            if resource_pool_path is not defined, VM will created in root of inventory
        :param networks: list of existing port groups. NIC are based on this list
        :param datastore: name of datastore, which will be contain VM files; if not
            specified, VM will be placed in first datastore, which is avaliable
            for chosen host
        :param description: description for VM
        :param guestosid: ID for guest OS; full list
            http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.vm.GuestOsDescriptor.GuestOsIdentifier.html
        :param memorysize: size of RAM, which will be avaliable on VM, in Mb
        :param cpucount: count of CPU, which will be avaliable on VM
        :param create_hard_drive: if True, new .vmdk disk will be created and added to VM
        :param disk_space: hard drive's maximal size, in Kb
        """
        params = {}

        if vmname:
            params["vm_name"] = vmname
        else:
            raise AttributeError("Couldn't specify a virtual machine name")

        if iso:
            params["iso"] = iso
        if datacenter:
            params["datacenter_name"] = datacenter
        if datastore:
            params["datastore_name"] = datastore
        if resource_pool:
            params["resource_pool_name"] = resource_pool
        if not networks:
            networks = []
        if networks:
            params["networks"] = networks
        if not description:
            params["description"] = "Description of %s" % vmname
        else:
            params["description"] = description

        params["esx_hostname"] = esx_hostname
        params["guestosid"] = guestosid
        params["memory_size"] = memorysize
        params["cpu_count"] = cpucount
        params["disk_size"] = disk_space

        try:
            self.create_vm(params)
        except ExistenceException as error:
            raise
        except CreatorException as error:
            raise
        except Exception as error:
            raise

    def create_vm(self, vm_options):
        """
         Creates a virtual machine on ESXi server
        :param vm_options: dict, which contain parameters for VM
        'vm_name'
        'iso'
        'datacenter_name'
        'datastore_name'
        'resource_pool_name'
        'networks'
        'description'
        'esx_hostname'
        'hard_drive'
        'guestosid'
        'memory_size'
        'cpu_count'
        'disk_size'
        See create_vm_old for details
        :raise: CreatorException, ExistenceException
        """
        self._connect_to_esx()

        # VM NAME
        vm_name = None
        try:
            vm_name = str(vm_options["vm_name"])
            vm_temp = self.esx_server.get_vm_by_name(vm_name)
            if vm_temp:
                raise ExistenceException('VM "%s" already exists' % vm_name)
        except KeyError:
            raise CreatorException("Must specify VM name")
        except pysphere.VIException as inst:
            if "[Object Not Found]" in str(inst):
                pass

        # HOSTNAME
        hosts = self.esx_server.get_hosts()
        try:
            esx_hostname = vm_options["esx_hostname"]
            if not esx_hostname:
                raise KeyError
            elif not (esx_hostname in hosts.values()):
                raise CreatorException("Couldn't find host '%s'" % esx_hostname)
        except KeyError:
            if len(hosts.values()) > 1:
                raise CreatorException("More than 1 host - must specify ESX Hostname")
            elif not hosts.values():
                raise CreatorException("Couldn't find available host")
            esx_hostname = hosts[0]
            # MOR and PROPERTIES
        hostmor = [k for k, v in hosts.items() if v == esx_hostname][0]
        hostprop = VIProperty(self.esx_server, hostmor)

        # DATACENTER - FIX EXCEPTION
        # todo: fix self.esx_server.get_datacenters().values()
        dcs = self.esx_server.get_datacenters()
        dc_values = dcs.values()
        try:
            dc_name = vm_options["datacenter_name"]
            if not dc_name in dc_values:
                raise CreatorException("Couldn't find datacenter '%s'" + dc_name)
        except KeyError:
            if len(dc_values) > 1:
                raise CreatorException("More than 1 datacenter - must specify ESX Hostname")
            elif not dc_values:
                raise CreatorException("Couldn't find available datacenter")
            dc_name = dc_values[0]
            # MOR and PROPERTIES
        dcmor = [k for k, v in dcs.items() if v == dc_name][0]
        dcprops = VIProperty(self.esx_server, dcmor)

        # DATASTORE
        dcs = hostprop.datastore
        try:
            ds_name = vm_options["datastore_name"]
            ds_list = []
            for ds in dcs:
                ds_list.append(ds.name)
            if not ds_name in ds_list:
                raise CreatorException("Couldn't find datastore or datastore is not available")
        except KeyError:
            if len(dcs) > 1:
                raise CreatorException("More than 1 datastore on ESX - must specify datastore name")
            elif not dcs:
                raise CreatorException("Couldn't find available datastore")
            ds_name = dcs[0].name

        # RESOURCE POOL
        resource_pool_name = ""
        try:
            resource_pool_name = vm_options["resource_pool_name"]
            if resource_pool_name == "/":
                pass
            elif resource_pool_name[0] != "/":
                resource_pool_name = "/{0}".format(resource_pool_name)
        except KeyError:
            resource_pool_name = "/"
        finally:
            rpmor = self._fetch_resource_pool(resource_pool_name, esx_hostname)
            if not rpmor:
                raise CreatorException("Couldn't find resource pool '%s'" % resource_pool_name)

        # NETWORKS
        try:
            networks = list(vm_options["networks"])
        except Exception:
            networks = []

        try:
            iso = vm_options["iso"]
            if iso == False:
                iso = None
            else:
                # todo: hide magic
                iso = iso[iso.find(ds_name) + len(ds_name) + 1 :]
        except KeyError:
            iso = None

        # Description
        try:
            description = vm_options["description"]
        except KeyError:
            description = "Description for VM %s" % vm_name

        try:
            guestosid = vm_options["guestosid"]
        except KeyError:
            guestosid = "otherGuest"

        try:
            memory_size = int(vm_options["memory_size"])
            if memory_size <= 0:
                raise CreatorException("Disk size must be greater than 0")
        except Exception:
            memory_size = DEFAULT_MEMORY_SIZE  # MB

        try:
            cpu_count = int(vm_options["cpu_count"])
        except Exception:
            cpu_count = DEFAULT_CPU_COUNT

        try:
            disk_size = int(vm_options["disk_size"])
            if disk_size < 0:
                raise CreatorException("Disk size must be greater than 0")
        except Exception:
            disk_size = DEFAULT_DISK_SIZE  # KB

        crprops = self._fetch_computer_resource(dcprops, hostmor)
        vmfmor = dcprops.vmFolder._obj

        # CREATE VM CONFIGURATION
        # get config target
        request = VI.QueryConfigTargetRequestMsg()
        _this = request.new__this(crprops.environmentBrowser._obj)
        _this.set_attribute_type(crprops.environmentBrowser._obj.get_attribute_type())
        request.set_element__this(_this)
        h = request.new_host(hostmor)
        h.set_attribute_type(hostmor.get_attribute_type())
        request.set_element_host(h)
        config_target = self.esx_server._proxy.QueryConfigTarget(request)._returnval

        # get default devices
        request = VI.QueryConfigOptionRequestMsg()
        _this = request.new__this(crprops.environmentBrowser._obj)
        _this.set_attribute_type(crprops.environmentBrowser._obj.get_attribute_type())
        request.set_element__this(_this)
        h = request.new_host(hostmor)
        h.set_attribute_type(hostmor.get_attribute_type())
        request.set_element_host(h)
        config_option = self.esx_server._proxy.QueryConfigOption(request)._returnval
        defaul_devs = config_option.DefaultDevice

        # get network name
        avaliable_networks = 0
        for net in networks:
            for n in config_target.Network:
                if n.Network.Accessible and n.Network.Name == net:
                    avaliable_networks += 1
                    break
        if len(networks) != avaliable_networks:
            msg = ""
            for n in config_target.Network:
                msg = "%s %s" % (msg, str(n.Network.Name))
            raise CreatorException("Couldn't find all networks; founded: %s" % msg)
            # raise ExistenceException("Couldn't find network")

            # get datastore
        ds = None
        for d in config_target.Datastore:
            if d.Datastore.Accessible and d.Datastore.Name == ds_name:
                ds = d.Datastore.Datastore
                ds_name = d.Datastore.Name
                break
        if not ds:
            raise CreatorException("Datastore is not available")
        volume_name = "[%s]" % ds_name

        # add parameters to the create vm task
        create_vm_request = VI.CreateVM_TaskRequestMsg()
        config = create_vm_request.new_config()
        vmfiles = config.new_files()
        vmfiles.set_element_vmPathName(volume_name)
        config.set_element_files(vmfiles)
        config.set_element_name(vm_name)
        config.set_element_annotation(description)
        config.set_element_memoryMB(memory_size)
        config.set_element_numCPUs(cpu_count)
        config.set_element_guestId(guestosid)
        devices = []

        # add a scsi controller
        disk_ctrl_key = 1
        scsi_ctrl_spec = config.new_deviceChange()
        scsi_ctrl_spec.set_element_operation("add")
        scsi_ctrl = VI.ns0.VirtualLsiLogicController_Def("scsi_ctrl").pyclass()
        scsi_ctrl.set_element_busNumber(0)
        scsi_ctrl.set_element_key(disk_ctrl_key)
        scsi_ctrl.set_element_sharedBus("noSharing")
        scsi_ctrl_spec.set_element_device(scsi_ctrl)
        devices.append(scsi_ctrl_spec)

        # find ide controller
        if iso:
            ide_ctlr = None
            for dev in defaul_devs:
                if dev.typecode.type[1] == "VirtualIDEController":
                    ide_ctlr = dev
                    # add a cdrom based on a physical device
            if ide_ctlr:
                cd_spec = config.new_deviceChange()
                cd_spec.set_element_operation("add")
                cd_ctrl = VI.ns0.VirtualCdrom_Def("cd_ctrl").pyclass()
                cd_device_backing = VI.ns0.VirtualCdromIsoBackingInfo_Def("cd_device_backing").pyclass()
                ds_ref = cd_device_backing.new_datastore(ds)
                ds_ref.set_attribute_type(ds.get_attribute_type())
                cd_device_backing.set_element_datastore(ds_ref)
                cd_device_backing.set_element_fileName("%s %s" % (volume_name, iso))
                cd_ctrl.set_element_backing(cd_device_backing)
                cd_ctrl.set_element_key(20)
                cd_ctrl.set_element_controllerKey(ide_ctlr.get_element_key())
                cd_ctrl.set_element_unitNumber(0)
                cd_spec.set_element_device(cd_ctrl)
                devices.append(cd_spec)

        # create a new disk - file based - for the vm
        if disk_size != 0:
            disk_spec = config.new_deviceChange()
            disk_spec.set_element_fileOperation("create")
            disk_spec.set_element_operation("add")
            disk_ctlr = VI.ns0.VirtualDisk_Def("disk_ctlr").pyclass()
            disk_backing = VI.ns0.VirtualDiskFlatVer2BackingInfo_Def("disk_backing").pyclass()
            disk_backing.set_element_fileName(volume_name)
            disk_backing.set_element_diskMode("persistent")
            disk_ctlr.set_element_key(0)
            disk_ctlr.set_element_controllerKey(disk_ctrl_key)
            disk_ctlr.set_element_unitNumber(0)
            disk_ctlr.set_element_backing(disk_backing)
            disk_ctlr.set_element_capacityInKB(disk_size)
            disk_spec.set_element_device(disk_ctlr)
            devices.append(disk_spec)

        # add a NIC. the network Name must be set as the device name to create the NIC.
        for network_name in networks:
            nic_spec = config.new_deviceChange()
            nic_spec.set_element_operation("add")
            nic_ctlr = VI.ns0.VirtualPCNet32_Def("nic_ctlr").pyclass()
            nic_backing = VI.ns0.VirtualEthernetCardNetworkBackingInfo_Def("nic_backing").pyclass()
            nic_backing.set_element_deviceName(network_name)
            nic_ctlr.set_element_addressType("generated")
            nic_ctlr.set_element_backing(nic_backing)
            nic_ctlr.set_element_key(4)
            nic_spec.set_element_device(nic_ctlr)
            devices.append(nic_spec)

        config.set_element_deviceChange(devices)
        create_vm_request.set_element_config(config)
        folder_mor = create_vm_request.new__this(vmfmor)
        folder_mor.set_attribute_type(vmfmor.get_attribute_type())
        create_vm_request.set_element__this(folder_mor)
        rp_mor = create_vm_request.new_pool(rpmor)
        rp_mor.set_attribute_type(rpmor.get_attribute_type())
        create_vm_request.set_element_pool(rp_mor)
        host_mor = create_vm_request.new_host(hostmor)
        host_mor.set_attribute_type(hostmor.get_attribute_type())
        create_vm_request.set_element_host(host_mor)

        # CREATE THE VM - add option "wait"
        taskmor = self.esx_server._proxy.CreateVM_Task(create_vm_request)._returnval
        task = VITask(taskmor, self.esx_server)
        task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR])
        if task.get_state() == task.STATE_ERROR:
            self._disconnect_from_esx()
            raise CreatorException("Error creating vm: %s" % task.get_error_message())

    def create_virtual_switch(self, name, num_ports, esx_hostname=None):
        """
        Creates a new standard virtual switch on esx
        :param name: name for new virtual switch
        :param num_ports: numbers of emulated ports
        :param esx_hostname: host name of esx server when virtual switch will be created
        :raise: CreatorException, ExistenceException
        """
        num_ports = int(num_ports)

        self._connect_to_esx()
        hosts = None
        try:
            hosts = self.esx_server.get_hosts()
            if esx_hostname:
                host_system = [k for k, v in hosts.items() if v == esx_hostname][0]
            else:
                host_system = hosts.keys()[0]
        except IndexError:
            raise CreatorException("Couldn't find host")
        if not host_system:
            raise CreatorException("Couldn't find host")

        prop = VIProperty(self.esx_server, host_system)
        network_system = prop.configManager.networkSystem._obj

        for vs in prop.configManager.networkSystem.networkInfo.vswitch:
            if vs.name == name:
                self._disconnect_from_esx()
                raise ExistenceException("Switch '%s' already exist" % name)

        request = VI.AddVirtualSwitchRequestMsg()
        _this = request.new__this(network_system)
        _this.set_attribute_type(network_system.get_attribute_type())
        request.set_element__this(_this)
        request.set_element_vswitchName(name)

        spec = request.new_spec()
        spec.set_element_numPorts(num_ports)
        request.set_element_spec(spec)

        try:
            self.esx_server._proxy.AddVirtualSwitch(request)
        except Exception:
            raise CreatorException("Couldn't create Switch")

            # self._disconnect_from_esx()

    def destroy_virtual_switch(self, name, esx_hostname=None):
        """
        Destroys a named standard virtual switch on esx
        :param name: virtual switch's name
        :param esx_hostname: host name of esx server when virtual switch placed
        :raise: CreatorException, ExistenceException
        """
        self._connect_to_esx()
        hosts = self.esx_server.get_hosts()
        try:
            if esx_hostname:
                host_system = [k for k, v in hosts.items() if v == esx_hostname][0]
            else:
                host_system = hosts.keys()[0]
        except Exception:
            raise CreatorException("Couldn't find host")
        prop = VIProperty(self.esx_server, host_system)
        network_system = prop.configManager.networkSystem._obj

        exist = False
        for vs in prop.configManager.networkSystem.networkInfo.vswitch:
            if vs.name == name:
                exist = True
                break

        if exist:
            request = VI.RemoveVirtualSwitchRequestMsg()
            _this = request.new__this(network_system)
            _this.set_attribute_type(network_system.get_attribute_type())
            request.set_element__this(_this)
            request.set_element_vswitchName(name)
            try:
                self.esx_server._proxy.RemoveVirtualSwitch(request)
            except Exception:
                raise CreatorException("Couldn't remove virtual switch '%s'" % name)
        else:
            raise ExistenceException("Couldn't find virtual switch '%s'" % name)
            # self._disconnect_from_esx()

    def add_port_group(self, switch_name, vlan_name, esx_hostname=None, vlan_id=4095, promiscuous=False):
        """
        Add new network to exist switch

        :param switch_name: vlan_name of switch which will be reconfigured
        :param vlan_name: vlan_name of VLAN
        :param esx_hostname: ESX hostname
        :param vlan_id: id for VLAN
        :param promiscuous: promiscuous mode enable/disable (True/False)
        :raise: ExistenceException, CreatorException
        """
        self._connect_to_esx()

        vlan_id = int(vlan_id)

        hosts = self.esx_server.get_hosts()
        try:
            if esx_hostname:
                host_system = [k for k, v in hosts.items() if v == esx_hostname][0]
            else:
                host_system = hosts.keys()[0]
        except Exception:
            raise CreatorException("Couldn't find host")

        prop = VIProperty(self.esx_server, host_system)
        network_system = prop.configManager.networkSystem._obj

        request = VI.AddPortGroupRequestMsg()
        _this = request.new__this(network_system)
        _this.set_attribute_type(network_system.get_attribute_type())
        request.set_element__this(_this)

        portgrp = request.new_portgrp()
        portgrp.set_element_name(vlan_name)
        portgrp.set_element_vlanId(vlan_id)
        portgrp.set_element_vswitchName(switch_name)

        policy = portgrp.new_policy()
        security = policy.new_security()
        security.set_element_allowPromiscuous(promiscuous)
        policy.set_element_security(security)
        portgrp.set_element_policy(policy)

        request.set_element_portgrp(portgrp)

        try:
            self.esx_server._proxy.AddPortGroup(request)
        except Exception as inst:
            message = str(inst)
            if "already exist" in message:
                raise ExistenceException(
                    "Couldn't create network '%s:%s' on switch '%s', because it already exists" % vlan_name,
                    vlan_id,
                    switch_name,
                )
            else:
                raise CreatorException(
                    "Couldn't create network '%s:%s' on switch '%s'" % vlan_name, vlan_id, switch_name
                )

                # self._disconnect_from_esx()

    def is_connected(self):
        """
        Checks ESX manager connection

        :rtype : bool
        :return: connection status
        """
        return self.esx_server.is_connected()

    def vm_power_on(self, vmname):
        """
        Turns power on for the virtual machine

        :param vmname: virtual machine name
        :raise: ExistenceException, AttributeError, Exception
        """
        if not vmname:
            raise AttributeError("Couldn't specify the virtual machine name")

        if not self._is_vm_exist(vmname):
            raise ExistenceException("Couldn't find the virtual machine '%s'" % vmname)

        try:
            self._connect_to_esx()
            vm = self.esx_server.get_vm_by_name(vmname)
            if not vm.is_powered_on() and not vm.is_powering_on():
                vm.power_on()
        except Exception as error:
            self._disconnect_from_esx()
            raise CreatorException(error)

    def vm_power_off(self, vmname):
        """
        Turns power off for the virtual machine

        :param vmname: virtual machine name
        :raise: ExistenceException, AttributeError, Exception
        """
        if not vmname:
            raise AttributeError("Couldn't specify the virtual machine name")

        if not self._is_vm_exist(vmname):
            raise ExistenceException("Couldn't find the virtual machine '%s'" % vmname)

        try:
            self._connect_to_esx()
            vm = self.esx_server.get_vm_by_name(vmname)
            if not vm.is_powered_off() and not vm.is_powering_off():
                vm.power_off()
        except Exception as error:
            self._disconnect_from_esx()
            raise CreatorException(error)

    def vm_reset(self, vmname):
        """
        Resets a virtual machine.
        If the virtual machine is powered off, then turns the power on for this virtual machine
        :param vmname: virtual machine name
        :raise: AttributeError, ExistenceException, Exception
        """
        if not vmname:
            raise AttributeError("Couldn't specify the virtual machine name")

        if not self._is_vm_exist(vmname):
            raise ExistenceException("Couldn't find the virtual machine '%s'" % vmname)

        try:
            self._connect_to_esx()
            vm = self.esx_server.get_vm_by_name(vmname)
            if not vm.is_powered_off():
                vm.reset()
            else:
                vm.power_on()
        except Exception as error:
            self._disconnect_from_esx()
            raise CreatorException(error)

    def get_vm_path(self, vmname):

        """
        Gets a virtual machine path on ESX server
        :param vmname: virtual machine name
        :return: virtual machine path
        :raise: CreatorException
        """
        self._connect_to_esx()

        try:
            vm = self.esx_server.get_vm_by_name(vmname)
        except Exception:
            raise ExistenceException("Couldn't find the virtual machine '%s'" % vmname)

        try:
            return vm.get_property("path")
        except Exception as error:
            self._disconnect_from_esx()
            raise CreatorException(error)

            pass
            # todo: REVIEW ME

    def get_vm_obj(self, vmname):

        """
        Gets a virtual machine object on ESX server
        :param vmname: virtual machine name
        :return: VIVirtualMachine instance
        :raise: CreatorException
        """
        self._connect_to_esx()

        try:
            return self.esx_server.get_vm_by_name(vmname)
        except Exception:
            raise ExistenceException("Couldn't find the virtual machine '%s'" % vmname)
        finally:
            self._disconnect_from_esx()

    def add_existence_vmdk(self, vm_name, path):
        """
        Add existence hard drive (.vmdk) to the virtual machine
        :param vm_name: virtual machine name
        :param path: hard drive path
        :param space: space for hard drive
        :raise: ExistenceException, CreatorException
        """
        self._connect_to_esx()
        try:
            vm = self.esx_server.get_vm_by_name(vm_name)
        except Exception:
            raise ExistenceException("Couldn't find the virtual machine %s" % vm_name)

        unit_number = -1
        for disk in vm._disks:
            unit_number = max(unit_number, disk["device"]["unitNumber"])
        unit_number += 1

        request = VI.ReconfigVM_TaskRequestMsg()
        _this = request.new__this(vm._mor)
        _this.set_attribute_type(vm._mor.get_attribute_type())
        request.set_element__this(_this)

        spec = request.new_spec()

        dc = spec.new_deviceChange()
        dc.Operation = "add"

        hd = VI.ns0.VirtualDisk_Def("hd").pyclass()
        hd.Key = -100
        hd.UnitNumber = unit_number
        hd.CapacityInKB = 0
        hd.ControllerKey = 1000

        backing = VI.ns0.VirtualDiskFlatVer2BackingInfo_Def("backing").pyclass()
        backing.FileName = path
        backing.DiskMode = "persistent"
        backing.ThinProvisioned = False
        hd.Backing = backing

        connectable = hd.new_connectable()
        connectable.StartConnected = True
        connectable.AllowGuestControl = False
        connectable.Connected = True
        hd.Connectable = connectable

        dc.Device = hd

        spec.DeviceChange = [dc]
        request.Spec = spec

        task = self.esx_server._proxy.ReconfigVM_Task(request)._returnval
        vi_task = VITask(task, self.esx_server)

        # Wait for task to finis
        status = vi_task.wait_for_state([vi_task.STATE_SUCCESS, vi_task.STATE_ERROR])
        if status == vi_task.STATE_ERROR:
            self._disconnect_from_esx()
            raise CreatorException("ERROR CONFIGURING VM:%s" % vi_task.get_error_message())

    # todo: add comment
    def _get_portgroup_name(self, name, esx_hostname=None):
        """
        Get exist network from ESX
        :param name: network name
        :param esx_hostname: ESX host name
        :return: :raise:
        """

        self._connect_to_esx()
        hosts = self.esx_server.get_hosts()
        try:
            if esx_hostname:
                host_system = [k for k, v in hosts.items() if v == esx_hostname][0]
            else:
                host_system = hosts.keys()[0]
        except IndexError:
            raise CreatorException("Couldn't find host")
        if not host_system:
            raise CreatorException("Couldn't find host")

        prop = VIProperty(self.esx_server, host_system)

        for pg in prop.configManager.networkSystem.networkInfo.portgroup:
            if pg.spec.name.lower() == name.lower():
                real_name = pg.spec.name
                # self._disconnect_from_esx()
                return real_name

        # self._disconnect_from_esx()
        return None

    # todo: add comment
    def _is_vm_exist(self, name):
        """

        :param name:
        :return:
        """
        self._connect_to_esx()
        exist = False
        try:
            self.esx_server.get_vm_by_name(name)
            exist = True
        except:
            pass
            # self._disconnect_from_esx()
        return exist

    # todo: add comment
    def _fetch_resource_pool(self, rp_name, esx_hostname):

        """

        :param rp_name:
        :param esx_hostname:
        :return:
        """
        rpmor = None

        if rp_name == "/":
            rp_mor_temp = [k for k, v in self.esx_server.get_resource_pools().items() if v == "/Resources"]
            for rp in rp_mor_temp:
                prop = VIProperty(self.esx_server, rp)
                if prop.parent.name == esx_hostname:
                    rpmor = rp
                    break
        else:
            resource_pool = "/Resources" + rp_name

            rp_mor_temp = [k for k, v in self.esx_server.get_resource_pools().items() if v == resource_pool]

            for rp in rp_mor_temp:
                prop = VIProperty(self.esx_server, rp)
                while prop.parent.name != "host":
                    prop = prop.parent
                    if prop.name == esx_hostname:
                        rpmor = rp
                        break
                if rp:
                    break

        return rpmor

    # todo: add comment
    def _fetch_computer_resource(self, datacenter_props, host):
        """

        :param datacenter_props:
        :param host:
        :return:
        """
        host_folder = datacenter_props.hostFolder._obj

        # get computer resources
        computer_resources = self.esx_server._retrieve_properties_traversal(
            property_names=["name", "host"], from_node=host_folder, obj_type="ComputeResource"
        )

        # get computer resource of this host
        crmor = None
        for cr in computer_resources:
            if crmor:
                break
            for p in cr.PropSet:
                if p.Name == "host":
                    for h in p.Val.get_element_ManagedObjectReference():
                        if h == host:
                            crmor = cr.Obj
                            break
                    if crmor:
                        break
        return VIProperty(self.esx_server, crmor)
Ejemplo n.º 35
0
class VMWareSystem(MgmtSystemAPIBase):
    """Client to Vsphere API

    This class piggy backs off pysphere.

    Benefits of pysphere:
      - Don't need intimate knowledge w/ vsphere api itself.
    Detriments of pysphere:
      - Response often are not detailed enough.

    """

    _stats_available = {
        'num_vm': lambda self: len(self.list_vm()),
        'num_host': lambda self: len(self.list_host()),
        'num_cluster': lambda self: len(self.list_cluster()),
        'num_template': lambda self: len(self.list_template()),
        'num_datastore': lambda self: len(self.list_datastore()),
    }

    def __init__(self, hostname, username, password, **kwargs):
        self.api = VIServer()
        self.api.connect(hostname, username, password)

    def _get_vm(self, vm_name=None):
        if vm_name is None:
            raise Exception('Could not find a VM named %s.' % vm_name)
        else:
            try:
                vm = self.api.get_vm_by_name(vm_name)
                return vm
            except VIException as ex:
                raise Exception(ex)

    def does_vm_exist(self, name):
        try:
            self._get_vm(name)
            return True
        except Exception:
            return False

    def _get_resource_pool(self, resource_pool_name=None):
        rps = self.api.get_resource_pools()
        for mor, path in rps.iteritems():
            if re.match('.*%s' % resource_pool_name, path):
                return mor
        # Just pick the first
        return rps.keys()[0]

    def get_ip_address(self, vm_name):
        vm = self._get_vm(vm_name)
        maxwait = 600
        net_info = None
        waitcount = 0
        while net_info is None:
            if waitcount > maxwait:
                break
            net_info = vm.get_property('net', False)
            waitcount += 5
            time.sleep(5)
        if net_info:
            ipv4_re = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
            for ip in net_info[0]['ip_addresses']:
                if re.match(ipv4_re, ip) and ip != '127.0.0.1':
                    return ip
        return None

    def _get_list_vms(self, get_template=False):
        template_or_vm_list = []

        props = self.api._retrieve_properties_traversal(property_names=['name', 'config.template'],
                                                        from_node=None,
                                                        obj_type=MORTypes.VirtualMachine)
        for prop in props:
            vm = None
            template = None
            for elem in prop.PropSet:
                if elem.Name == "name":
                    vm = elem.Val
                elif elem.Name == "config.template":
                    template = elem.Val
            if vm is None or template is None:
                continue
            if template == bool(get_template):
                template_or_vm_list.append(vm)
        return template_or_vm_list

    def start_vm(self, vm_name):
        vm = self._get_vm(vm_name)
        if vm.is_powered_on():
            return True
        else:
            vm.power_on()
            ack = vm.get_status()
            if ack == 'POWERED ON':
                return True
        return False

    def stop_vm(self, vm_name):
        vm = self._get_vm(vm_name)
        if vm.is_powered_off():
            return True
        else:
            vm.power_off()
            ack = vm.get_status()
            if ack == 'POWERED OFF':
                return True
        return False

    def delete_vm(self, vm_name):
        vm = self._get_vm(vm_name)

        if vm.is_powered_on():
            self.stop_vm(vm_name)

        # When pysphere moves up to 0.1.8, we can just do:
        # vm.destroy()
        request = VI.Destroy_TaskRequestMsg()
        _this = request.new__this(vm._mor)
        _this.set_attribute_type(vm._mor.get_attribute_type())
        request.set_element__this(_this)
        rtn = self.api._proxy.Destroy_Task(request)._returnval

        task = VITask(rtn, self.api)
        status = task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR])
        if status == task.STATE_SUCCESS:
            return True
        else:
            return False

    def create_vm(self, vm_name):
        raise NotImplementedError('This function has not yet been implemented.')

    def restart_vm(self, vm_name):
        if not self.stop_vm(vm_name):
            return False
        else:
            return self.start_vm(vm_name)

    def list_vm(self):
        return self._get_list_vms()

    def list_template(self):
        return self._get_list_vms(get_template=True)

    def list_flavor(self):
        raise NotImplementedError('This function is not supported on this platform.')

    def list_host(self):
        return self.api.get_hosts()

    def list_datastore(self):
        return self.api.get_datastores()

    def list_cluster(self):
        return self.api.get_clusters()

    def info(self):
        return '%s %s' % (self.api.get_server_type(), self.api.get_api_version())

    def disconnect(self):
        self.api.disconnect()

    def vm_status(self, vm_name):
        state = self._get_vm(vm_name).get_status()
        print "vm " + vm_name + " status is " + state
        return state

    def is_vm_running(self, vm_name):
        state = self.vm_status(vm_name)
        return "POWERED ON" == state

    def is_vm_stopped(self, vm_name):
        state = self.vm_status(vm_name)
        return "POWERED OFF" == state

    def is_vm_suspended(self, vm_name):
        state = self.vm_status(vm_name)
        return "SUSPENDED" == state

    def suspend_vm(self, vm_name):
        vm = self._get_vm(vm_name)
        if vm.is_powered_off():
            raise Exception('Could not suspend %s because it\'s not running.' % vm_name)
        else:
            vm.suspend()
            return self.is_vm_suspended(vm_name)

    def clone_vm(self):
        raise NotImplementedError('clone_vm not implemented.')

    def deploy_template(self, template, *args, **kwargs):
        if 'resourcepool' not in kwargs:
            kwargs['resourcepool'] = None
        vm = self._get_vm(template)
        if vm:
            vm.clone(kwargs['vm_name'], sync_run=True,
                resourcepool=self._get_resource_pool(kwargs['resourcepool']))
            return kwargs['vm_name']
        else:
            raise Exception('Could not clone %s' % template)
def main():

    setup_logger()

    log(level="info",
        msg="===================================================")
    log(level="info", msg="detect_installation_completion logger initialized.")

    opts = options()

    # CONNECTION PARAMTERS
    server = opts.esx_host
    user = opts.user
    password = opts.passwd

    # REQUIRED PARAMETERS
    vmname = opts.name

    # CONNECT TO THE SERVER
    s = VIServer()
    s.connect(server, user, password)

    log(level="info", msg="Attempting to locate the guest VM: %s" % vmname)
    count = 1
    wait_for = 10
    while count < wait_for:
        count += 1
        try:
            guest_vm = s.get_vm_by_name(opts.name)
            if guest_vm:
                break
        except Exception as e:
            if count >= wait_for:
                log(level="error", msg="Failed to locate the new VM (%s) even after %s seconds." %
                    (vmname, str(wait_for)))
                log(level="info", msg="Please login to the EXSi server and fix the issue. Exception: %s" %
                    str(e))
                sys.exit(1)

        time.sleep(1)
        log(level="info", msg="Elapsed %s seconds ..." % str(count))

    check_count(count, wait_for)
    log(level="info", msg="Located VM: %s" % vmname)
    log(level="info", msg="Waiting for the OS installation to complete...")
    log(level="info", msg="Will wait for about 60 minutes (at max) ...")

    wait_for = 3600  # 1 hour.
    log(level="info",
        msg="Note: There will be no output as the process would be blocked in waiting state until the Guest OS responds.")
    log(level="info",
        msg="Will automatically timeout after an hour (at max) ...")
    try:
        guest_vm.wait_for_tools(timeout=wait_for)
    except Exception as e:
        if count >= wait_for:
            log(level="error", msg="Failed to get OS installation status in the new VM (%s) even after %s seconds." %
                (vmname, str(wait_for)))
            log(level="info", msg="Please login to the EXSi server and fix the issue. Exception: %s" %
                str(e))
            sys.exit(1)

    log(level="info", msg="Received response from the Guest OS.")
    log(level="info",
        msg="Attempting to login in the Guest to check the status of the OS instalaltion (timeout 5 minutes) ...")
    count = 1
    wait_for = 300  # 5 minutes
    while count < wait_for:
        try:
            guest_vm.login_in_guest(opts.username, opts.password)
            break
        except Exception as e:
            if count >= wait_for:
                log(level="error", msg="Failed to login to the Guest (%s) even after %s seconds." %
                    (vmname, str(wait_for)))
                log(level="info", msg="Please login to the EXSi server and fix the issue. Exception: %s" %
                    str(e))
                sys.exit(1)
        count += 1
        time.sleep(1)
        log(level="info", msg="Elapsed %s seconds ..." % str(count))

    check_count(count, wait_for)
    log(level="info", msg="Successfully logged into guest.")
    log(level="info",
        msg="Checking the progress of the OS installation (will timeout after 30 minutes (at max)) ...")
    log(level="info", msg="OS installation is still in progress.")
    log(level="info",
        msg="Waiting for it to complete (will timeout after 60 minutes (at max)) ...")
    count = 1
    wait_for = 3600  # 60 minutes
    filename = "/etc/INSTALLATION_COMPLETED"

    while count < wait_for:
        try:
            flag_file = guest_vm.list_files(filename)
            if flag_file[0]['path'] == filename:
                log(level="info",
                    msg="OS installation has completed. Successfully.")
                break
        except Exception as e:
            if count >= wait_for:
                log(level="error", msg="OS installation is still in progress in %s even after %s seconds. This is not expected." %
                    (vmname, str(wait_for)))
                log(level="info", msg="Please login to the EXSi server and fix the issue. Exception: %s" %
                    str(e))
                sys.exit(1)

        count += 180
        time.sleep(180)
        log(level="info", msg="Elapsed %s seconds ..." % str(count))

    check_count(count, wait_for)

    if opts.fetch_ip is True:

        vm_ip = guest_vm.get_property(
            'net', from_cache=False)[0]['ip_addresses'][0]
        log(level="info", msg="IP address of the deployed VM: %s" % str(vm_ip))

        ip_file_path = settings.DEPLOYED_VM_IP_SAVE_FOLDER + "/%s.txt" % vmname
        try:
            with open(ip_file_path, 'w') as f:
                f.write(vm_ip)
                log(level="info", msg="Saved the IP of the deployed machine in: %s" %
                    ip_file_path)
                f.close()
        except:
            log(level="error", msg="Failed to save the IP information in %s. Please try again." %
                ip_file_path)

    else:  # if opts.fetch_ip == False

        try:
            network_fix = guest_vm.list_files('/etc/init.d/vm_network_fix')
            log(level="info", msg="Network fix already exists. Nothing needs to be done.")
        except:
            try:
                # Network fix does not exist.
                log(level="info", msg="Network fix does not exist. Uploading vm_network_fix.")
                guest_vm.send_file('vm_network_fix', '/etc/init.d/vm_network_fix', overwrite=True)
                log(level="info", msg="Upload of vm_network_fix successful. Changing permissions.")
                guest_vm.start_process('/bin/chmod', args=[
                                   '755', 'vm_network_fix'], cwd='/etc/init.d')
                time.sleep(1)
                log(level="info", msg="Changing permissions successful. Adding the daemon to start-up sequence.")
                guest_vm.start_process('/sbin/chkconfig', args=[
                                   '--add', 'vm_network_fix'], cwd='/etc/init.d')
                time.sleep(1)
                log(level="info", msg="Updating start-up sequence successful. Starting the daemon.")
                guest_vm.start_process('/sbin/service', args=[
                                   'vm_network_fix', 'start'], cwd='/etc/init.d')
                time.sleep(1)
                log(level="info", msg="Daemon process started successfully.")
            except Exception as e:
                log(level="error", msg="Failed to upload vm_network_fix and start the daemon. Exception: " + str(e))

        log(level="info",
            msg="Waiting for 60 seconds so that all services start successfully.")
        count = 1
        wait_for = 60
        while count < wait_for:
            count += 2
            time.sleep(2)
            log(level="info", msg="Elapsed %s seconds ..." % str(count))

        log(level="info", msg="All services should be up and running now ...")
        log(level="info",
            msg="Issuing a graceful shutdown request to the Guest.")
        try:
            guest_vm.start_process('/sbin/shutdown', args=[
                                   '-h', 'now'], cwd='/root')
            time.sleep(1)
            count = 1
            wait_for = 900  # 30 minutes.
            log(level="info", msg="Waiting for the Guest to power-off ...")
            while guest_vm.is_powered_off() is False:
                time.sleep(1)
                count += 1
                log(level="info", msg="Elapsed %s seconds ..." % str(count))
                if count >= wait_for:
                    log(level="warning",
                        msg="Its been 30 minutes and yet the system did not poweroff. This not expected.")
                    log(level="warning",
                        msg="OVFTool may hard-poweroff the VM while attempting to create an OVA of it.")
                    break
            if count < wait_for:
                log(level="info", msg="%s powered off successfully." % vmname)
        except Exception as e:
            log(level="error",
                msg="Could not issue a graceful shutdown request to the guest.")
            log(level="warning",
                msg="OVFTool may hard-poweroff the VM while attempting to create an OVA of it.")
            log(level="error", msg="Exception: %s" % str(e))

        # Disconnect CDROM device from the VM.
        try:
            disconnect_vm_cdroms(guest_vm, s)
            log(level="info", msg="Disconnected Virtual CDROM from %s successfully." %
                vmname)
        except:
            log(level="error", msg="Exception while attempting to disconnect the virtual CD rom of %s." %
                vmname)
            log(level="error", msg="Exception: %s" % str(e))

    # disconnect from the server
    s.disconnect()

    sys.exit(0)
Ejemplo n.º 37
0
#!/usr/bin/python
"""
Author: Pryz
Description: Get current status and properties of a VM with pysphere 
"""
from pysphere import VIServer

# Connect to the vcenter
LOGIN = "******"
PWD = "password"
VCENTER = "vcenter.labo.fr"
SERVER = VIServer()
SERVER.connect(VCENTER, LOGIN, PWD)

VMNAME = "vm1.labo.fr"
VM = SERVER.get_vm_by_name(VMNAME)
print VM.get_status()
print VM.get_property("ip_address")
print VM.get_properties()

# Close connection
SERVER.disconnect()
Ejemplo n.º 38
0
#!/usr/bin/python
'''
Author: Pryz
Description: Get current status and properties of a VM with pysphere 
'''
from pysphere import VIServer

# Connect to the vcenter
LOGIN = "******"
PWD = "password"
VCENTER = "vcenter.labo.fr"
SERVER = VIServer()
SERVER.connect(VCENTER, LOGIN, PWD)

VMNAME = "vm1.labo.fr"
VM = SERVER.get_vm_by_name(VMNAME)
print VM.get_status()
print VM.get_property('ip_address')
print VM.get_properties()

# Close connection
SERVER.disconnect()

Ejemplo n.º 39
0
class MyApp:
    def __init__(self, parent):
        self.myScanner = parent
        # self.myScanner.geometry('800x600')
        self.myScanner.title('ESX/ESXi Server Vulnerability Scanner')
        self.myContainer = Frame(parent)
        self.myContainer.pack()

        # 提示
        self.tip = Label(self.myContainer,
                         text="提示:\n\
请输入IP、先获取服务器版本。如果是ESX Server,请继续输入用户名,\n\
密码然后开始扫描;如果是ESXi Server,无需用户名密码,直接扫描。\n\
扫描完成后,打开index.html查看结果。",
                         bg='green')
        self.tip.grid(row=0, column=0, columnspan=3)

        # IP
        self.ip_label = Label(self.myContainer, text="IP:")
        self.ip_label.grid(row=1, column=0, sticky=E + W)
        self.ip = Entry(self.myContainer, text="")
        self.ip.grid(row=1, column=1, sticky=E + W)

        # 先检查是ESX还是ESXi
        self.getVersion_button = Button(
            self.myContainer,
            text="获取服务器版本",
            fg="black",
            command=self.serverVersion)  #lose command
        self.getVersion_button.grid(row=1, column=2, sticky=W + E)

        # Server版本
        self.version_label = Label(self.myContainer, text="服务器版本:")
        self.version_label.grid(row=2, column=0, sticky=E + W)
        self.version_text = Text(self.myContainer, width=35, height=1)
        self.version_text.grid(row=2, column=1, columnspan=2, sticky=E + W)

        # 用户名
        self.user_label = Label(self.myContainer, text="用户名:")
        self.user_label.grid(row=3, column=0, sticky=E + W)
        self.user = Entry(self.myContainer, text="")
        self.user.grid(row=3, column=1, sticky=E + W)

        # 密码
        self.passwd_label = Label(self.myContainer, text="密码:")
        self.passwd_label.grid(row=4, column=0, sticky=E + W)
        self.passwd = Entry(self.myContainer, text="")
        self.passwd.grid(row=4, column=1, sticky=E + W)
        self.passwd['show'] = '*'

        # 检查是否有漏洞
        self.vulnCheck_button = Button(self.myContainer,
                                       text="扫描",
                                       fg="black",
                                       command=self.vulnCheck)  #lose command
        self.vulnCheck_button.grid(row=3, column=2, rowspan=2, sticky=W + E)
        """# 运行状况
        self.status_label = Label(self.myContainer, text="运行状况:")
        self.status_label.grid(row = 5, column = 0, sticky = E+W)
        
        # 运行状态
        self.status = Text(self.myContainer, width = 48)
        self.status.grid(row = 6, column = 0, columnspan = 3)"""

    def serverVersion(self):
        self.server = VIServer()
        try:
            self.server.connect_no_auth(self.ip.get())
            self.serverFullname = self.server.get_server_fullname()
            self.server.disconnect()
            self.version_text.insert('end', self.serverFullname)
        except:
            print "Maybe the remote host is not a ESX/ESXi Server."

    def vulnCheck(self):
        #重置result.xml
        result = open("result/result.xml", "w")
        result.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n")
        result.write("<result>\n")
        result.write("</result>\n")
        result.close()
        if re.search('ESXi', self.serverFullname):
            self.version = re.search('\d\.\d\.\d', self.serverFullname)
            self.buildnumber = re.search('\d{6}', self.serverFullname)

            # 填写Server信息
            info = open("result/server_info.xml", "w")
            info.write('<?xml version="1.0" encoding="UTF-8" ?>\n')
            info.write("<serverInfo>\n")
            info.write("    <release>%s</release>\n" % self.serverFullname)
            info.write("    <version>ESXi %s</version>\n" %
                       self.version.group())
            info.write("    <build>%s</build>\n" % self.buildnumber.group())
            info.write("</serverInfo>")

            info.close()

            #获取ESXi扫描脚本
            vmsas = os.listdir('ESXi_script')
            for vmsa in vmsas:
                if vmsa != '__init__.py':
                    cmd = "python ESXi_script/%s" % vmsa.strip()
                    os.system(cmd)
                # self.status.insert(1.0, "%s complete!\n" % vmsa.strip())
                # self.status.insert(END, "%s complete!\n" % vmsa.strip())
        else:
            x = esx_pkgs()
            #重置esx_info.xml
            info = open("result/server_info.xml", "w")
            if x.connect(self.ip.get(), self.user.get(),
                         self.passwd.get()) != False:
                # 连接目标服务器成功
                # self.status.insert(1.0, "Connect remote ESX Server success!!\n")
                # self.status.insert('end', "Connect remote ESX Server success!!\n")
                # self.status.get(INSERT)

                info.write('<?xml version="1.0" encoding="UTF-8" ?>\n')
                info.write("<serverInfo>\n")
                info.write("    <arch>%s</arch>\n" % x.get_host_cpu())
                info.write("    <release>%s</release>\n" % self.serverFullname)
                info.write("    <version>%s</version>\n" % x.get_version())
                info.write("    <patches>%s</patches>\n" % x.get_esxupdate())
                info.write("    <NewestBundle>%s</NewestBundle>\n" %
                           x.get_newestbundle())
                info.write("</serverInfo>")
            else:  # 连接目标服务器失败
                # self.status.insert(1.0, "Can't connect remote ESX server!!\nMaybe the username or password is not correct.\n")
                # self.status.insert('end', "Can't connect remote ESX server!!\nMaybe the username or password is not correct.\n")
                return False

            info.close()
            x.disconnect()

            #获取ESX扫描脚本
            vmsas = os.listdir('ESX_script')
            for vmsa in vmsas:
                if vmsa != '__init__.py':
                    cmd = "python ESX_script/%s" % vmsa.strip()
                    os.system(cmd)
Ejemplo n.º 40
0
def create_vm():
    opts = options()

    # CONNECTION PARAMTERS
    server = opts.esx_host
    user = opts.user
    password = opts.passwd

    # REQUIRED PARAMETERS
    vmname = opts.name
    # datacentername = "ha-datacenter"
    datacentername = opts.datacenter
    hostname = opts.hostname
    annotation = "My Product Product Virtual Machine"
    memorysize = opts.ram
    cpucount = opts.cpus
    # cd_iso_location =
    # "iso/My_Product_2013_02_26_05_15_00.iso"
    # # located in the ESX datastore
    cd_iso_location = opts.iso
    guestosid = "centos64Guest"
    # find your os in
    # http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.vm.GuestOsDescriptor.GuestOsIdentifier.html
    disksize = (1024 ** 2) * 100  # In Kb: 1024 ** 2 (power) = 1GB; 1GB * 100 = 100GB.

    # OPTIONAL PARAMETERS

    datastorename = opts.datastore  # if None, will use the first datastore available

    # CONNECT TO THE SERVER
    s = VIServer()
    s.connect(server, user, password)

    # GET INITIAL PROPERTIES AND OBJECTS

     # get datacenter
    dcmor = s._get_datacenters()[datacentername]
    dcprops = VIProperty(s, dcmor)
     # get host folder
    hfmor = dcprops.hostFolder._obj

     # get computer resources
    crmors = s._retrieve_properties_traversal(property_names=['name',
                                                              'host'], from_node=hfmor, obj_type='ComputeResource')

     # get host
    for hosts in s.get_hosts().items():
        try:
            if hosts.index(hostname) == 1:
                hostmor = hosts[0]
        except:
            pass

    # get computer resource of this host
    crmor = None
    for cr in crmors:
        if crmor:
            break
        for p in cr.PropSet:
            # print 'p.Name:', p.Name
            if p.Name == "host":
                for h in p.Val.get_element_ManagedObjectReference():
                    if h == hostmor:
                        crmor = cr.Obj
                        break
                if crmor:
                    break
    crprops = VIProperty(s, crmor)

     # get resource pool
    rpmor = crprops.resourcePool._obj

     # get vmFolder
    vmfmor = dcprops.vmFolder._obj

    # CREATE VM CONFIGURATION

     # get config target
    request = VI.QueryConfigTargetRequestMsg()
    _this = request.new__this(crprops.environmentBrowser._obj)
    _this.set_attribute_type(crprops.environmentBrowser._obj.get_attribute_type())
    request.set_element__this(_this)
    h = request.new_host(hostmor)
    h.set_attribute_type(hostmor.get_attribute_type())
    request.set_element_host(h)
    config_target = s._proxy.QueryConfigTarget(request)._returnval

     # get default devices
    request = VI.QueryConfigOptionRequestMsg()
    _this = request.new__this(crprops.environmentBrowser._obj)
    _this.set_attribute_type(crprops.environmentBrowser._obj.get_attribute_type())
    request.set_element__this(_this)
    h = request.new_host(hostmor)
    h.set_attribute_type(hostmor.get_attribute_type())
    request.set_element_host(h)
    config_option = s._proxy.QueryConfigOption(request)._returnval
    defaul_devs = config_option.DefaultDevice

    # get network name
    # would be assigned to the last known working network interface.
    # in this case, it would be VM Network 2.
    network_name = None
    for n in config_target.Network:
        if n.Network.Accessible:
            network_name = n.Network.Name

    # can hard-code it as 'VM Network'

    # get datastore
    # Just verifies that the datastorename mentioned at the top matches with the
    # available list of datastores.
    ds = None
    for d in config_target.Datastore:
        if d.Datastore.Accessible and (datastorename and d.Datastore.Name
                                       == datastorename) or (not datastorename):
            ds = d.Datastore.Datastore
            datastorename = d.Datastore.Name
            break
    if not ds:
        raise Exception("couldn't find datastore")
    volume_name = "[%s]" % datastorename

     # add parameters to the create vm task
    create_vm_request = VI.CreateVM_TaskRequestMsg()
    config = create_vm_request.new_config()
    vmfiles = config.new_files()
    vmfiles.set_element_vmPathName(volume_name)
    config.set_element_files(vmfiles)
    config.set_element_name(vmname)
    config.set_element_annotation(annotation)
    config.set_element_memoryMB(memorysize)
    config.set_element_numCPUs(cpucount)
    config.set_element_guestId(guestosid)
    devices = []

     # add a scsi controller
    disk_ctrl_key = 1
    scsi_ctrl_spec = config.new_deviceChange()
    scsi_ctrl_spec.set_element_operation('add')
    scsi_ctrl = VI.ns0.VirtualLsiLogicController_Def("scsi_ctrl").pyclass()
    scsi_ctrl.set_element_busNumber(0)
    scsi_ctrl.set_element_key(disk_ctrl_key)
    scsi_ctrl.set_element_sharedBus("noSharing")

    scsi_ctrl_spec.set_element_device(scsi_ctrl)
    devices.append(scsi_ctrl_spec)

     # find ide controller
    ide_ctlr = None
    for dev in defaul_devs:
        if dev.typecode.type[1] == "VirtualIDEController":
            ide_ctlr = dev

     # add a cdrom based on a physical device
    if ide_ctlr:
        cd_spec = config.new_deviceChange()
        cd_spec.set_element_operation('add')
        cd_ctrl = VI.ns0.VirtualCdrom_Def("cd_ctrl").pyclass()
        cd_device_backing = VI.ns0.VirtualCdromIsoBackingInfo_Def("cd_device_backing").pyclass()
        ds_ref = cd_device_backing.new_datastore(ds)
        ds_ref.set_attribute_type(ds.get_attribute_type())
        cd_device_backing.set_element_datastore(ds_ref)
        cd_device_backing.set_element_fileName("%s %s" % (volume_name,
                                                          cd_iso_location))
        cd_ctrl.set_element_backing(cd_device_backing)
        cd_ctrl.set_element_key(20)
        cd_ctrl.set_element_controllerKey(ide_ctlr.get_element_key())
        cd_ctrl.set_element_unitNumber(0)
        cd_spec.set_element_device(cd_ctrl)
        devices.append(cd_spec)

     # create a new disk - file based - for the vm
    disk_spec = config.new_deviceChange()
    disk_spec.set_element_fileOperation("create")
    disk_spec.set_element_operation("add")
    disk_ctlr = VI.ns0.VirtualDisk_Def("disk_ctlr").pyclass()
    disk_backing = VI.ns0.VirtualDiskFlatVer2BackingInfo_Def("disk_backing").pyclass()
    disk_backing.set_element_fileName(volume_name)
    disk_backing.set_element_diskMode("persistent")
    disk_backing.ThinProvisioned = True
    disk_ctlr.set_element_key(0)
    disk_ctlr.set_element_controllerKey(disk_ctrl_key)
    disk_ctlr.set_element_unitNumber(0)
    disk_ctlr.set_element_backing(disk_backing)
    disk_ctlr.set_element_capacityInKB(disksize)
    disk_spec.set_element_device(disk_ctlr)
    devices.append(disk_spec)

     # add a NIC. the network Name must be set as the device name to create the NIC.
    nic_spec = config.new_deviceChange()
    if network_name:
        nic_spec.set_element_operation("add")
        nic_ctlr = VI.ns0.VirtualPCNet32_Def("nic_ctlr").pyclass()
        nic_backing = VI.ns0.VirtualEthernetCardNetworkBackingInfo_Def("nic_backing").pyclass()
        nic_backing.set_element_deviceName(network_name)
        nic_ctlr.set_element_addressType("generated")
        nic_ctlr.set_element_backing(nic_backing)
        nic_ctlr.set_element_key(4)
        nic_spec.set_element_device(nic_ctlr)
        devices.append(nic_spec)

    config.set_element_deviceChange(devices)
    create_vm_request.set_element_config(config)
    folder_mor = create_vm_request.new__this(vmfmor)
    folder_mor.set_attribute_type(vmfmor.get_attribute_type())
    create_vm_request.set_element__this(folder_mor)
    rp_mor = create_vm_request.new_pool(rpmor)
    rp_mor.set_attribute_type(rpmor.get_attribute_type())
    create_vm_request.set_element_pool(rp_mor)
    host_mor = create_vm_request.new_host(hostmor)
    host_mor.set_attribute_type(hostmor.get_attribute_type())
    create_vm_request.set_element_host(host_mor)

    # CREATE THE VM
    taskmor = s._proxy.CreateVM_Task(create_vm_request)._returnval
    task = VITask(taskmor, s)
    task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR])

    if task.get_state() == task.STATE_ERROR:
        raise Exception("Error creating vm: %s" %
                        task.get_error_message())

    # Here you should power your VM (refer to the pysphere documentation)
    # So it boots from the specified ISO location
    try:
        new_vm = s.get_vm_by_name(opts.name)
        connect_vm_cdroms(new_vm, s)
        try:
            new_vm.power_on()
        except Exception as e:
            print "Failed to power-on the new VM using:", opts.name
            print "Exception:", str(e)
    except Exception as e:
        print "Failed to locate the new VM using:", opts.name
        print "Exception:", str(e)
    # disconnect from the server
    s.disconnect()
Ejemplo n.º 41
0
class VMWareSystem(MgmtSystemAPIBase):
    """Client to Vsphere API

    This class piggy backs off pysphere.

    Benefits of pysphere:
      - Don't need intimate knowledge w/ vsphere api itself.
    Detriments of pysphere:
      - Response often are not detailed enough.

    """

    def __init__(self, hostname, username, password, **kwargs):
        self.api = VIServer()
        self.api.connect(hostname, username, password)

    def _get_vm(self, vm_name=None):
        if vm_name is None:
            raise Exception('Could not find a VM named %s.' % vm_name)
        else:
            try:
                vm = self.api.get_vm_by_name(vm_name)
                return vm
            except VIException as ex:
                raise Exception(ex)

    def _get_resource_pool(self, resource_pool_name=None):
        rps = self.api.get_resource_pools()
        for mor, path in rps.iteritems():
            if re.match('.*%s' % resource_pool_name, path):
                return mor
        # Just pick the first
        return rps.keys()[0]

    def _find_ip(self, vm):
        maxwait = 600
        net_info = None
        waitcount = 0
        while net_info is None:
            if waitcount > maxwait:
                break
            net_info = vm.get_property('net', False)
            waitcount += 5
            time.sleep(5)
        if net_info:
            ipv4_re = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
            for ip in net_info[0]['ip_addresses']:
                if re.match(ipv4_re, ip) and ip != '127.0.0.1':
                    return ip
        return None

    def start_vm(self, vm_name):
        vm = self._get_vm(vm_name)
        if vm.is_powered_on():
            return True
        else:
            vm.power_on()
            ack = vm.get_status()
            if ack == 'POWERED ON':
                return True
        return False

    def stop_vm(self, vm_name):
        vm = self._get_vm(vm_name)
        if vm.is_powered_off():
            return True
        else:
            vm.power_off()
            ack = vm.get_status()
            if ack == 'POWERED OFF':
                return True
        return False

    def delete_vm(self, vm_name):
        vm = self._get_vm(vm_name)

        if vm.is_powered_on():
            self.stop_vm(vm_name)

        # When pysphere moves up to 0.1.8, we can just do:
        # vm.destroy()
        request = VI.Destroy_TaskRequestMsg()
        _this = request.new__this(vm._mor)
        _this.set_attribute_type(vm._mor.get_attribute_type())
        request.set_element__this(_this)
        rtn = self.api._proxy.Destroy_Task(request)._returnval

        task = VITask(rtn, self.api)
        status = task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR])
        if status == task.STATE_SUCCESS:
            return True
        else:
            return False

    def create_vm(self, vm_name):
        raise NotImplementedError('This function has not yet been implemented.')

    def restart_vm(self, vm_name):
        if not self.stop_vm(vm_name):
            return False
        else:
            return self.start_vm(vm_name)

    def list_vm(self, **kwargs):
        vm_list = self.api.get_registered_vms(**kwargs)

        # The vms come back in an unhelpful format, so run them through a regex
        # Example vm name: '[datastore] vmname/vmname.vmx'
        def vm_name_generator():
            for vm in vm_list:
                match = re.match(r'\[.*\] (.*)/\1\..*', vm)
                if match:
                    yield match.group(1)

        # Unroll the VM name generator, and sort it to be more user-friendly
        return sorted(list(vm_name_generator()))

    def info(self):
        return '%s %s' % (self.api.get_server_type(), self.api.get_api_version())

    def disconnect(self):
        self.api.disconnect()

    def vm_status(self, vm_name):
        state = self._get_vm(vm_name).get_status()
        print "vm " + vm_name + " status is " + state
        return state

    def is_vm_running(self, vm_name):
        state = self.vm_status(vm_name)
        return "POWERED ON" == state

    def is_vm_stopped(self, vm_name):
        state = self.vm_status(vm_name)
        return "POWERED OFF" == state

    def is_vm_suspended(self, vm_name):
        state = self.vm_status(vm_name)
        return "SUSPENDED" == state

    def suspend_vm(self, vm_name):
        vm = self._get_vm(vm_name)
        if vm.is_powered_off():
            raise Exception('Could not suspend %s because it\'s not running.' % vm_name)
        else:
            vm.suspend()
            return self.is_vm_suspended(vm_name)

    def clone_vm(self, source_name, vm_name, resourcepool=None):
        vm = self._get_vm(source_name)
        if vm:
            clone = vm.clone(vm_name, sync_run=True,
                resourcepool=self._get_resource_pool(resourcepool))
            return self._find_ip(clone)
        else:
            raise Exception('Could not clone %s' % source_name)
Ejemplo n.º 42
0
def get_vms_info(host_ip,host_name,host_password):
    vms_dict_data = []
    server = VIServer()
    server.connect(host_ip, host_name, host_password)
    # print 'VC connect successful...'
    #DebugInfo.objects.create(text_info='VM connect successful...')

    vms_info = {}

    # VMware API接口定义
    properties = [
        'summary.vm',
        'summary.config.numEthernetCards',
        'summary.config.annotation',
        'summary.config.numVirtualDisks',
        'summary.quickStats.overallCpuUsage',
        'summary.quickStats.guestMemoryUsage',
        'summary.quickStats.ftLogBandwidth',
        'summary.quickStats.hostMemoryUsage',
        'summary.quickStats.uptimeSeconds',
        'summary.runtime.powerState',
        'summary.runtime.bootTime',
        'summary.runtime.host',
        'summary.runtime.maxCpuUsage',
        'summary.runtime.maxMemoryUsage',
        'summary.storage.committed',
        'summary.storage.uncommitted',
        'summary.storage.unshared',
        'summary.storage.timestamp',
        'guestHeartbeatStatus',
        'guest.toolsStatus',
        'guest.toolsVersionStatus',
        'guest.toolsVersion',
        'guest.guestId',
        'guest.guestFullName',
        'guest.guestState',
        'guest.ipAddress',
        'guest.hostName',
        'name',
        'parent',
        'config.template',
        'config.hardware.numCPU',
        'config.hardware.memoryMB'
    ]

    # 通过_retrieve_properties_traversal方法传入API接口定义拿到对象类型为 VirtualMachine 的信息
    props = server._retrieve_properties_traversal(property_names=properties, obj_type='VirtualMachine')

    # 通过server.get_hosts()拿到VC下面所有的host信息(字典);
    # 通过这个方法可以把'guest.hostName'取出的MOR对象转换成实际的hostname
    # hostname = server.get_hosts().items()

    for prop in props:
        mor = prop.Obj
        vm = {}
        for p in prop.PropSet:
            vm[p.Name] = p.Val
        vms_info[mor] = vm

    vms_dict = vms_info.values()

    for i in range(len(vms_dict)):
        vm = vms_dict[i]
        # pprint.pprint(vm)
        #DebugInfo.objects.create(text_info=vm)
        vms_dict_data.append(vm)
        #DebugInfo.objects.create(text_info=vms_dict_data)

    #print 'VC disconnect successful...'

    server.disconnect()
    return vms_dict_data
Ejemplo n.º 43
0
class MyApp:
    def __init__(self, parent):
        self.myScanner = parent
       # self.myScanner.geometry('800x600')
        self.myScanner.title('ESX/ESXi Server Vulnerability Scanner')
        self.myContainer = Frame(parent)
        self.myContainer.pack()
        
        # 提示
        self.tip = Label(self.myContainer, text = "提示:\n\
请输入IP、先获取服务器版本。如果是ESX Server,请继续输入用户名,\n\
密码然后开始扫描;如果是ESXi Server,无需用户名密码,直接扫描。\n\
扫描完成后,打开index.html查看结果。", bg = 'green')
        self.tip.grid(row = 0, column = 0, columnspan = 3)
        
        # IP
        self.ip_label = Label(self.myContainer, text="IP:")
        self.ip_label.grid(row = 1, column = 0, sticky = E+W)
        self.ip = Entry(self.myContainer, text="")
        self.ip.grid(row = 1, column = 1, sticky = E+W)

        # 先检查是ESX还是ESXi
        self.getVersion_button = Button(self.myContainer, text="获取服务器版本", fg="black", command = self.serverVersion) #lose command
        self.getVersion_button.grid(row = 1, column = 2, sticky = W+E)
        
        # Server版本
        self.version_label = Label(self.myContainer, text="服务器版本:")
        self.version_label.grid(row = 2, column = 0, sticky = E+W)
        self.version_text = Text(self.myContainer, width = 35, height = 1)
        self.version_text.grid(row = 2, column = 1, columnspan = 2, sticky = E+W)
        
        # 用户名
        self.user_label = Label(self.myContainer, text="用户名:")
        self.user_label.grid(row = 3, column = 0, sticky = E+W)
        self.user = Entry(self.myContainer, text="")
        self.user.grid(row = 3, column = 1, sticky = E+W)
        
        # 密码
        self.passwd_label = Label(self.myContainer, text="密码:")
        self.passwd_label.grid(row = 4, column = 0, sticky = E+W)
        self.passwd = Entry(self.myContainer, text="")
        self.passwd.grid(row = 4, column = 1, sticky = E+W)
        self.passwd['show'] = '*'
        
        # 检查是否有漏洞
        self.vulnCheck_button = Button(self.myContainer, text="扫描", fg="black", command = self.vulnCheck) #lose command
        self.vulnCheck_button.grid(row = 3, column = 2, rowspan = 2, sticky = W+E)
        
        """# 运行状况
        self.status_label = Label(self.myContainer, text="运行状况:")
        self.status_label.grid(row = 5, column = 0, sticky = E+W)
        
        # 运行状态
        self.status = Text(self.myContainer, width = 48)
        self.status.grid(row = 6, column = 0, columnspan = 3)"""
        
    def serverVersion(self):
        self.server = VIServer()
        try:
            self.server.connect_no_auth(self.ip.get())
            self.serverFullname = self.server.get_server_fullname()
            self.server.disconnect()
            self.version_text.insert('end', self.serverFullname)
        except:
            print "Maybe the remote host is not a ESX/ESXi Server."
    
    def vulnCheck(self):
        #重置result.xml
        result = open("result/result.xml", "w")
        result.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n")
        result.write("<result>\n")
        result.write("</result>\n")
        result.close()
        if re.search('ESXi', self.serverFullname):
            self.version = re.search('\d\.\d\.\d', self.serverFullname)
            self.buildnumber = re.search('\d{6}', self.serverFullname)
            
            # 填写Server信息
            info = open("result/server_info.xml", "w")
            info.write('<?xml version="1.0" encoding="UTF-8" ?>\n')
            info.write("<serverInfo>\n")
            info.write("    <release>%s</release>\n" %self.serverFullname)
            info.write("    <version>ESXi %s</version>\n" %self.version.group())
            info.write("    <build>%s</build>\n" %self.buildnumber.group())
            info.write("</serverInfo>")
            
            info.close()
            
            #获取ESXi扫描脚本
            vmsas = os.listdir('ESXi_script')
            for vmsa in vmsas:
                if vmsa != '__init__.py':
                    cmd = "python ESXi_script/%s" % vmsa.strip()
                    os.system(cmd)
                   # self.status.insert(1.0, "%s complete!\n" % vmsa.strip())
                   # self.status.insert(END, "%s complete!\n" % vmsa.strip())
        else:
            x = esx_pkgs()
            #重置esx_info.xml
            info = open("result/server_info.xml", "w")
            if x.connect(self.ip.get(), self.user.get(), self.passwd.get()) != False:
               # 连接目标服务器成功
               # self.status.insert(1.0, "Connect remote ESX Server success!!\n")
               # self.status.insert('end', "Connect remote ESX Server success!!\n")
               # self.status.get(INSERT)
                
                info.write('<?xml version="1.0" encoding="UTF-8" ?>\n')
                info.write("<serverInfo>\n")
                info.write("    <arch>%s</arch>\n" %x.get_host_cpu())
                info.write("    <release>%s</release>\n" %self.serverFullname)
                info.write("    <version>%s</version>\n" %x.get_version())
                info.write("    <patches>%s</patches>\n" %x.get_esxupdate())
                info.write("    <NewestBundle>%s</NewestBundle>\n" %x.get_newestbundle())
                info.write("</serverInfo>")
            else: # 连接目标服务器失败
               # self.status.insert(1.0, "Can't connect remote ESX server!!\nMaybe the username or password is not correct.\n")
               # self.status.insert('end', "Can't connect remote ESX server!!\nMaybe the username or password is not correct.\n")
                return False
    
            info.close()
            x.disconnect()
            
            #获取ESX扫描脚本
            vmsas = os.listdir('ESX_script')
            for vmsa in vmsas:
                if vmsa != '__init__.py':
                    cmd = "python ESX_script/%s" % vmsa.strip()
                    os.system(cmd)
Ejemplo n.º 44
0
class VCenterManagement:
    server_ip = ''
    user_name = ''
    password = ''
    connect_flag = False
    server = None

    #vm_list      = []

    #def __init__(self):

    #Use the given args to connect the esxi server you want
    #@ip[string]: ESXi server's IP address
    #@name[string]: the username used to login the ESXi server
    #@pwd[string]: the password used to login the ESXi server
    def connect_server(self, ip, name, pwd):
        self.server_ip = ip
        self.user_name = name
        self.password = pwd
        self.server = VIServer()
        self.server.connect(self.server_ip, self.user_name, self.password)
        self.connect_flag = self.server.is_connected()
        if self.connect_flag:
            return True
        return False

    #To get all the definition registered vms from the connected server
    #@param[string]: can be set as ALL, POWER_ON, POWER_OFF, SUSPENDED
    #According to the param, returns a list of VM Paths. You might also filter by datacenter,
    #cluster, or resource pool by providing their name or MORs.
    #if  cluster is set, datacenter is ignored, and if resource pool is set
    #both, datacenter and cluster are ignored.
    def get_registered_vms(self,
                           param,
                           status=None,
                           datacenter=None,
                           cluster=None,
                           resource_pool=None):
        if param not in ['ALL', 'POWER_ON', 'POWER_OFF', 'SUSPENDED']:
            print "Get VMs error: param can only be set as ALL, POWER_ON, POWER_OFF, or SUSPENDED."
            return None
        if self.connect_flag == False:
            print "Get VMs error: Server not connected."
            return None
        if param == 'ALL':
            return self.server.get_registered_vms(datacenter, cluster,
                                                  resource_pool)
        elif param == 'POWER_ON':
            return self.server.get_registered_vms(datacenter,
                                                  cluster,
                                                  resource_pool,
                                                  status='poweredOn')
        elif param == 'POWER_OFF':
            return self.server.get_registered_vms(datacenter,
                                                  cluster,
                                                  resource_pool,
                                                  status='poweredOff')
        elif param == 'SUSPENDED':
            return self.server.get_registered_vms(datacenter,
                                                  cluster,
                                                  resource_pool,
                                                  status='suspended')
        else:
            return None

    #Disconnect to the Server
    def disconnect(self):
        if self.connect_flag == True:
            self.server = self.server.disconnect()
            self.connect_flag == False

    #To keep session alive
    def keep_session_alive(self):
        assert self.server.keep_session_alive()

    #To get the server type
    def get_server_type(self):
        return self.server.get_server_type()

    #To get performance manager
    def get_performance_manager(self):
        return self.server.get_performance_manager()

    #To get the all the server's hosts
    def get_all_hosts(self):
        """
        Returns a dictionary of the existing hosts keys are their names
        and values their ManagedObjectReference object.
        """
        return self.server.get_hosts()

    #To get all datastores
    def get_all_datastores(self):
        """
        Returns a dictionary of the existing datastores. Keys are
        ManagedObjectReference and values datastore names.
        """
        return self.server.get_datastores()

    #To get all clusters
    def get_all_clusters(self):
        """
        Returns a dictionary of the existing clusters. Keys are their 
        ManagedObjectReference objects and values their names.
        """
        return self.server.get_clusters()

    #To get all datacenters
    def get_all_datacenters(self):
        """
        Returns a dictionary of the existing datacenters. keys are their
        ManagedObjectReference objects and values their names.
        """
        return self.server.get_datacenters()

    #To get all resource pools
    def get_all_resource_pools(self):
        """
        Returns a dictionary of the existing ResourcePools. keys are their
        ManagedObjectReference objects and values their full path names.
        """
        return self.server.get_resource_pools()

    #To get hosts by name
    def get_hosts_by_name(self, from_mor):
        """
        Returns a dictionary of the existing ResourcePools. keys are their
        ManagedObjectReference objects and values their full path names.
        @from_mor: if given, retrieves the hosts contained within the specified 
            managed entity.
        """
        try:
            hosts_dic = self.server.get_hosts(from_mor)
        except:
            print "Get hosts error!"
            return None
        return hosts_dic

    def get_vm_by_name(self, vm_name):
        try:
            vm = self.server.get_vm_by_name(vm_name)
        except:
            print "Get vm error!"
            return None
        return vm

    def power_on_vm(self, vm_name):
        try:
            vm = self.get_vm_by_name(vm_name)
            if (vm.is_powered_off()):
                vm.power_on()
                print "vm " + vm_name + " power on success."
            else:
                print "vm " + vm_name + "is already power on"
                return False
        except:
            print "Power on vm " + vm_name + "error"
            return False
        return True

    def power_off_vm(self, vm_name):
        try:
            vm = self.get_vm_by_name(vm_name)
            if (vm.is_powered_on()):
                vm.power_off()
                print "vm " + vm_name + " power off success."
            else:
                print "vm " + vm_name + "is already power off"
                return False
        except:
            print "Power off vm " + vm_name + " error"
            return False
        return True
Ejemplo n.º 45
0
class EsxiController(object):
    def __init__(self, servername=None, password=None, username='******'):
        # Initialize viserver
        self.vi_server = VIServer()

        # Specify excluding VMs' preffix
        self.p = re.compile('xx|yy', re.I)

        self.class_name = self.__class__.__name__
        self.servername = servername
        self.username = username
        self.password = password
        self.vmlist = []
        self.vmstatusdict = {}
        self.inUse_vmstatusdict = {}
        self.vmfullnamelist = {}
        self.inUse_vmfullnamelist = {}
        self.vmdict = {}
        self.inUseDict = {}

    def connect(self):
        logging.debug('connecting to %s' % self.servername)

        try:
            self.vi_server.connect(self.servername,
                                   self.username,
                                   self.password,
                                   trace_file='/tmp/esxi_debug.txt')
        except BaseException as e:
            logging.debug('Can not connect to %s: %s' % (self.servername, e))
            # sys.exit(1)
        else:
            if self.vi_server.is_connected():
                logging.debug('connected to %s successfully' % self.servername)
                logging.debug('Currently server version is: %s %s' %
                              (self.vi_server.get_server_type(),
                               self.vi_server.get_api_version()))

    def disconnect(self):
        self.vi_server.disconnect()
        logging.debug('To disconnect from server %s\n' % self.servername)

    def get_vmlist(self):
        self.vmlist = self.vi_server.get_registered_vms()
        return self.vmlist

    def get_vmstatus(self):
        for vmPath in self.get_vmlist():
            vm = self.vi_server.get_vm_by_path(vmPath)
            vminfo = vm.get_properties(from_cache=False)
            vmstatus = vm.get_status()
            vmname = vminfo['name']
            self.vmstatusdict[vmname] = vmstatus
        return self.vmstatusdict

    def get_inuse_vmstatus(self):
        for vmPath in self.get_vmlist():
            vm = self.vi_server.get_vm_by_path(vmPath)
            vminfo = vm.get_properties(from_cache=False)
            vmstatus = vm.get_status()
            vmname = vminfo['name']
            in_use_vm = self.p.match(vmname)
            if in_use_vm is not None:
                self.inUse_vmstatusdict[vmname] = vmstatus
        return self.inUse_vmstatusdict

    def get_vmnamelist(self):
        for vmPath in self.get_vmlist():
            vm = self.vi_server.get_vm_by_path(vmPath)
            vminfo = vm.get_properties(from_cache=False)
            vmname = vminfo['name']
            vmfullnameinfo = vminfo['guest_full_name']
            self.vmfullnamelist[vmname] = vmfullnameinfo
        return self.vmfullnamelist

    def get_inuse_vmnamelist(self):
        for vmPath in self.get_vmlist():
            vm = self.vi_server.get_vm_by_path(vmPath)
            vminfo = vm.get_properties(from_cache=False)
            vmname = vminfo['name']
            vmfullnameinfo = vminfo['guest_full_name']
            in_use_vm = self.p.match(vmname)
            if in_use_vm is not None:
                self.inUse_vmfullnamelist[vmname] = vmfullnameinfo
        return self.inUse_vmfullnamelist

    def get_inuse_vmdict(self):
        for vmPath in self.get_vmlist():
            vm = self.vi_server.get_vm_by_path(vmPath)
            vminfo = vm.get_properties(from_cache=False)
            vmname = vminfo['name']
            vmpath = vminfo['path']
            in_use_vm = self.p.match(vmname)
            if in_use_vm is not None:
                self.vmdict[vmname] = vmpath
        return self.vmdict

    def power_off_all(self):
        for vmPath in self.get_vmlist():
            vm = self.vi_server.get_vm_by_path(vmPath)
            if not vm.is_powered_off():
                logging.debug('%s is powered on, now doing power off' % vmPath)
                vm.power_off()

    def power_on_all(self):
        for vmPath in self.get_vmlist():
            vm = self.vi_server.get_vm_by_path(vmPath)
            if not vm.is_powered_on():
                logging.debug('%s is powered off, now doing power on' % vmPath)
                vm.power_on()

    def power_on_in_use(self):
        for vmPath in self.get_vmlist():
            vm = self.vi_server.get_vm_by_path(vmPath)
            vminfo = vm.get_properties(from_cache=False)
            vmname = vminfo['name']
            vmpath = vminfo['path']
            in_use_vm = self.p.match(vmname)
            if in_use_vm is not None and not vm.is_powered_on():
                logging.debug('%s is powered off, now doing power on' % vmname)
                vm.power_on()

    def power_off_in_use(self):
        for vmPath in self.get_vmlist():
            vm = self.vi_server.get_vm_by_path(vmPath)
            vminfo = vm.get_properties(from_cache=False)
            vmname = vminfo['name']
            vmpath = vminfo['path']
            in_use_vm = self.p.match(vmname)
            if in_use_vm is not None and not vm.is_powered_off():
                logging.debug('%s is powered on, now doing power off' % vmname)
                vm.power_off()
Ejemplo n.º 46
0
def get_host_vm_info(vcsa_host):
    user = "******"
    passwd = "xxxxx"

    server = VIServer()
    server.connect(vcsa_host, user, passwd)
    print('\033[32mVC connect successful...\033[0m')

    host_info = dict()
    for esx_hostname, esx_ip in server.get_hosts().items():
        print(esx_hostname, esx_ip)

        props = server._retrieve_properties_traversal(property_names=[
            'name', 'summary.overallStatus',
            'summary.quickStats.overallMemoryUsage',
            'summary.quickStats.overallCpuUsage',
            'summary.hardware.memorySize', 'summary.hardware.numCpuCores',
            'summary.hardware.numCpuThreads', 'summary.hardware.cpuMhz',
            'summary.hardware.otherIdentifyingInfo', 'hardware.biosInfo',
            'summary.hardware', 'datastore'
        ],
                                                      from_node=esx_hostname,
                                                      obj_type="HostSystem")
        try:
            for prop_set in props:
                # mor = prop_set.Obj #in case you need it
                for prop in prop_set.PropSet:
                    if prop.Name == "summary.quickStats.overallMemoryUsage":
                        used_mem = prop.Val
                    elif prop.Name == "summary.quickStats.overallCpuUsage":
                        host_used_cpu = prop.Val
                    elif prop.Name == "summary.hardware.otherIdentifyingInfo":
                        identification_info_list = prop.Val.__dict__[
                            '_HostSystemIdentificationInfo']
                        host_sn = identification_info_list[-1].__dict__[
                            '_identifierValue']
                    elif prop.Name == "summary.hardware.memorySize":
                        host_info["server_mem"] = prop.Val
                    elif prop.Name == "summary.hardware.numCpuThreads":
                        host_cpu_num = prop.Val
                    elif prop.Name == "summary.hardware.numCpuCores":
                        host_cpucores_num = prop.Val
                    elif prop.Name == "summary.hardware.cpuMhz":
                        mhz_per_core = prop.Val
                    elif prop.Name == "summary.overallStatus":
                        host_status = prop.Val
                        if host_status == "green":
                            host_info["status"] = "running"
                        elif host_status == "gray":
                            host_info["status"] = "down"
                        elif host_status == "yellow":
                            host_info["status"] = "running"
                        elif host_status == "red":
                            host_info["status"] = "error"
                    elif prop.Name == "hardware.biosInfo":
                        time_tuple = prop.Val.__dict__['_releaseDate']
                        host_info["release_date"] = time.strftime(
                            "%Y-%m-%d", time_tuple)
                    # print HostBiosInfo
                    elif prop.Name == "datastore":
                        datastore_list = prop.Val.__dict__[
                            '_ManagedObjectReference']
                        server_disk = dict()
                        disk_all_free = dict()
                        Datastore_All = 0
                        Datastore_Free = 0
                        for index, ds in enumerate(datastore_list):
                            DatastoreCapacity = 0
                            DatastoreFreespace = 0
                            DatastoreUsagePercent = 0
                            props_d = server._retrieve_properties_traversal(
                                property_names=[
                                    'name', 'summary.capacity',
                                    'summary.freeSpace'
                                ],
                                from_node=ds,
                                obj_type="Datastore")
                            for prop_set_d in props_d:
                                for prop_d in prop_set_d.PropSet:
                                    if prop_d.Name == "summary.capacity":
                                        DatastoreCapacity = (prop_d.Val /
                                                             1024 / 1024 /
                                                             1024)
                                    elif prop_d.Name == "summary.freeSpace":
                                        DatastoreFreespace = (prop_d.Val /
                                                              1024 / 1024 /
                                                              1024)
                            DatastorePreUsagePercent = ((
                                (DatastoreCapacity - DatastoreFreespace) * 100)
                                                        / DatastoreCapacity)
                            disk_all_free[ds] = [
                                DatastoreCapacity, DatastoreFreespace,
                                DatastorePreUsagePercent
                            ]
                            Datastore_All = Datastore_All + DatastoreCapacity
                            Datastore_Free = Datastore_Free + DatastoreFreespace
                        DatastoreUsagePercent = ((
                            (Datastore_All - Datastore_Free) * 100) /
                                                 Datastore_All)
                        server_disk["total"] = Datastore_All
                        server_disk["free"] = Datastore_Free
                        server_disk["used_pct"] = DatastoreUsagePercent
                        server_disk["detail"] = disk_all_free
                        # print server_disk
                    elif prop.Name == "summary.hardware":
                        # print 'hardware----:', prop.Val.__dict__
                        hardware = prop.Val.__dict__
                        host_info["product_name"] = hardware['_model']
                        host_info["uuid"] = hardware['_uuid']
                        host_info["manufacturer"] = hardware['_vendor']
        except Exception as e:
            # print(prop.Val.__dict__)
            print(e)
            continue
            host_info["vmware_disk"] = server_disk
        host_info["used_cpu"] = (host_used_cpu * 100) / (host_cpucores_num *
                                                         mhz_per_core)
        host_info["server_cpu"] = host_cpu_num
        host_info["used_mem"] = '%.1f' % (
            (used_mem * 1024 * 1024 * 100) / host_info["server_mem"])
        host_info["is_vm"] = 0
        host_info['sn'] = host_sn
        host_info["os"] = "VMware ESX"
        host_info["hostname"] = esx_hostname
        host_info["nic_mac_ip"] = {esx_hostname: [{esx_hostname: [esx_ip]}]}
        host_info["check_update_time"] = datetime.datetime.now().strftime(
            "%Y-%m-%d %H:%M:%S")
        # host_running_num = len(server.get_registered_vms(esx_hostname, status='poweredOn'))
        # host_stop_num = len(server.get_registered_vms(esx_hostname, status='poweredOff'))
        host_info["vm_num"] = len(server.get_registered_vms(esx_hostname))
        res['params'] = host_info
        print(esx_ip, host_info)
        send(res)

    # vm host
    vms_info = dict()
    properties = [
        'summary.vm', 'summary.config.numEthernetCards',
        'summary.config.annotation', 'summary.config.numVirtualDisks',
        'summary.quickStats.overallCpuUsage',
        'summary.quickStats.guestMemoryUsage',
        'summary.quickStats.ftLogBandwidth',
        'summary.quickStats.hostMemoryUsage',
        'summary.quickStats.uptimeSeconds', 'summary.runtime.powerState',
        'summary.runtime.bootTime', 'summary.runtime.host',
        'summary.runtime.maxCpuUsage', 'summary.runtime.maxMemoryUsage',
        'summary.storage.committed', 'summary.storage.uncommitted',
        'summary.storage.unshared', 'summary.storage.timestamp',
        'guestHeartbeatStatus', 'guest.toolsStatus',
        'guest.toolsVersionStatus', 'guest.toolsVersion', 'guest.guestId',
        'guest.guestFullName', 'guest.guestState', 'guest.ipAddress',
        'guest.hostName', 'name', 'parent', 'config.template',
        'config.hardware.numCPU', 'config.hardware.memoryMB', 'config.uuid'
    ]

    # 通过_retrieve_properties_traversal方法传入API接口定义拿到对象类型为 VirtualMachine 的信息
    props = server._retrieve_properties_traversal(property_names=properties,
                                                  obj_type='VirtualMachine')
    server.disconnect()

    # 通过server.get_hosts()拿到VC下面所有的host信息(字典);
    # 通过这个方法可以把'guest.hostName'取出的MOR对象转换成实际的hostname
    # hostname = server.get_hosts().items()

    for prop in props:
        mor = prop.Obj
        vm = {}
        for p in prop.PropSet:
            vm[p.Name] = p.Val
        vms_info[mor] = vm

    vms_dict = vms_info.values()
    vm_info = {}
    for i in range(len(vms_dict)):
        vm = vms_dict[i]
        """
        {'config.hardware.numCPU': 2, 'guest.guestId': 'centos64Guest', 'guest.guestFullName': 'CentOS 4/5 or later (64-bit)', 
        'summary.quickStats.hostMemoryUsage': 3846, 'summary.storage.committed': 68898546142, 'guest.hostName': 'JF-PROD-zk02', 
        'summary.quickStats.uptimeSeconds': 63854590, 'summary.runtime.maxMemoryUsage': 4096, 
        'config.uuid': '564d162d-99ee-19a4-9b2d-6721d5e6f9f1', 'guest.ipAddress': '172.20.1.27', 
        'config.template': False, 'guest.toolsVersionStatus': 'guestToolsCurrent', 'summary.quickStats.ftLogBandwidth': -1, 
        'summary.config.numEthernetCards': 1, 'summary.storage.uncommitted': 1002, 'config.hardware.memoryMB': 4096, 
        'summary.runtime.host': 'host-396', 'summary.config.annotation': '', 'parent': 'group-v372', 
        'summary.quickStats.overallCpuUsage': 66, 'summary.runtime.powerState': 'poweredOn', 'summary.runtime.maxCpuUsage': 4400, 
        'guest.toolsVersion': '9536', 'guest.guestState': 'running', 'guestHeartbeatStatus': 'green', 'name': 'JF-PROD-zk02', 
        'summary.storage.timestamp': (2018, 11, 30, 15, 25, 30, 654, 0, 0), 'summary.storage.unshared': 64424509440, 
        'summary.config.numVirtualDisks': 2, 'summary.quickStats.guestMemoryUsage': 327, 
        'summary.runtime.bootTime': (2016, 9, 18, 23, 20, 56, 724, 0, 0), 'guest.toolsStatus': 'toolsOk', 'summary.vm': 'vm-401'}
        """
        # vm_info["hostname"] = vm["name"]
        vm_info["parent_host"] = vm["summary.runtime.host"]
        vm_info["uuid"] = vm["config.uuid"]
        vm_info["status"] = vm["guest.guestState"]
        print(vm_info)
        res['params'] = vm_info
        send(res)
Ejemplo n.º 47
0
Archivo: report.py Proyecto: Pryz/misc
class Report:
    """Class report. Generate a dictionnary with the VMs and these properties"""

    def __init__(self, config):
        self.login = config['user']
        self.password = config['password']
        self.vcenter = config['vcenter']
        self.server = VIServer()

    def connect(self):
        """Connect to the hypervisor"""
        self.server.connect(self.vcenter, self.login, self.password)

    def disconnect(self):
        """Close the connection with the hypervisor"""
        if self.server:
            self.server.disconnect()

    def generate_report(self):
        """Generate the report of the actual connection"""
        report = []
        # Create the report
        vms_list = self.server.get_registered_vms()
        for vm_path in vms_list:
            virtual_machine = self.server.get_vm_by_path(vm_path)
            if str(virtual_machine.__class__) != "pysphere.vi_virtual_machine.VIVirtualMachine":
                continue
            if re.match(r'rhel', virtual_machine.get_property('guest_id')):
                vm_infos = { 
                    'name': virtual_machine.get_property('name'), 
                    'ip': virtual_machine.get_property('ip_address'),
                    'os': virtual_machine.get_property('guest_id')
                }
            try:
                status = virtual_machine.get_status()
            except Exception, e:
                print "Couldn't do it: %s" % e
                vm_infos['powered'] = 'none'
                report.append(vm_infos)
                continue
            if status == "POWERED ON":
                vm_infos['powered'] = 'on'
                # Get version in ssh 
                ssh = subprocess.Popen([
                  "ssh", 
                  "-i ~/.ssh/id_rsa", 
                  "%s" % vm_infos['name'],
                  "cat /etc/redhat-release"],
                  shell=False,  stdout=subprocess.PIPE, stderr=subprocess.PIPE
                )
                release = ssh.stdout.readlines()
                if release == []:
                    error = ssh.stderr.readlines()
                    vm_infos['release'] = "error: " + error
                else:
                    regex = re.compile("release (\d.*).+\(\D*(\d*)\)")
                    r = regex.search(release[0])
                    release = r.groups()
                    if release[1].strip():
                        vm_infos['release'] = release[0] + "." + release[1]
                    else:
                        vm_infos['release'] = release[0]
            else:
                vm_infos['powered'] = 'off'
        report.append(vm_infos)

        return report
Ejemplo n.º 48
0
def main():
    vcenter = ""
    esx_username = ""
    esx_password = ""
    ldap_password = ""

    # Read config file in...
    vcf = ".vcenters"
    try:
        file = open(vcf, "r")
        read = file.read()
    except IOError:
        print "ERROR --> Config file '%s' does not exist! Please create it as described below." % vcf
        print "--> echo 'vc1 = \"<VCENTER1>\"' > %s" % vcf
        print "--> echo 'vc2 = \"<VCENTER2>\"' >> %s" % vcf
        print ""
        vserver.disconnect()
        exit(1)

    i = 1
    vc = {}
    for line in read.splitlines():
        if "vc%s = " % i in line:
            vc["vc" + str(i)] = line.split('=', 1)[1]
            i += 1
        if "domain = " in line:
            domain = line.split('=', 1)[1].lstrip().translate(None, '"')

    vc1 = vc.get("vc1").lstrip().translate(None, '"')
    vc2 = vc.get("vc2").lstrip().translate(None, '"')

    if domain == None:
        print "ERROR --> Domain is blank, add to settings in config..."
        print "--> echo 'domain = \"<DOMAIN>\"' >> %s" % vcf
        vserver.disconnect()
        exit(1)

    options, args = usage_and_opts(vc1, vc2)

    def connect_vsphere():
        default_context = ssl._create_default_https_context
        ssl._create_default_https_context = ssl._create_unverified_context
        vserver.connect(vcenter, esx_username, esx_password)

    if options.username:
        esx_username = options.username
        print "--> CruzID: " + esx_username
    else:
        print ""
        print "               Identity               "
        print "======================================"
        if esx_username == "":
            if py3:
                esx_username = input("--> Please input your CruzID: ")
            else:
                esx_username = raw_input("--> Please input your CruzID: ")
        else:
            print "--> CruzID: " + esx_username

    if esx_password == "":
        esx_password = getpass.getpass("--> Please input your AD password: "******"--> vCenter: " + vcenter
    else:
        print ""
        print "             vCenter            "
        print "================================"
        print "(1) %s" % vc1
        print "(2) %s" % vc2
        if vcenter == "":
            if py3:
                esx_c = input("--> Which vCenter: ")
            else:
                esx_c = raw_input("--> Which vCenter: ")
            if esx_c == "1" or esx_c == vc1:
                vcenter = vc1
            elif esx_c == "2" or esx_c == vc2:
                vcenter = vc2
            else:
                print "ERROR --> Please select a vCenter from list..."
                exit(1)
        else:
            print "--> vCenter: " + vcenter

    vserver = VIServer()
    connect_vsphere()

    hostname = select_host(vserver, options)
    vm = vserver.get_vm_by_name(hostname)

    ifc, curvlan = get_current_vlan(vserver, vm, hostname)
    curhost = vm.properties.runtime.host.name

    print ""
    print "    Settings of VM '%s'   " % hostname
    print "======================================="
    print "Current VLAN: %s" % curvlan
    print "Current HOST: %s" % curhost
    print ""

    destvlan = print_available_vlans(vserver, curhost, hostname, options)

    print ""
    print "NOTE --> Host will continue to use DHCP on new network if no static IP defined..."
    if py3:
        ans = input("--> Do you wish to set a static IP for VM '%s'? (Y/N): " %
                    hostname)
    else:
        ans = raw_input(
            "--> Do you wish to set a static IP for VM '%s'? (Y/N): " %
            hostname)
    print ""
    if ans == "Y" or ans == "y":
        set_host_static_ip(vserver, ifc, hostname, esx_username, options)
    else:
        restart_host_network(hostname, esx_username, ldap_password)

    change_dvs_net(vserver, vm, hostname, destvlan, curvlan)

    if platform.system() != "Darwin":
        call([
            "/local/adm/infoblox-scripts/remove_dcnet_dns_from_hostmaster.sh",
            hostname
        ])

    vserver.disconnect()
Ejemplo n.º 49
0
    def vmaction(self, vm_name, vm_hz):
        m = Info_log(time.strftime('%Y-%m-%d', time.localtime(time.time())))
        log = m.log()
        server_obj = VIServer()
        try:
            server_obj.connect(self.host_ip, self.user, self.password)
        except Exception as e:
            server_obj.disconnect()
            log.info(e)

        # 通过名称获取vm的实例
        try:
            vm = server_obj.get_vm_by_name(vm_name)
        except Exception as e:
            server_obj.disconnect()
            return 0
        if vm.is_powered_off() == False:
            try:
                vm.reset()
                # logger.info (type(int(vm_hz)))
                for i in range(1, int(vm_hz)):
                    log.info('虚拟机%s 正在重置中。。。。,请等待注册\n' % (vm_name))
                    time.sleep(1)
                log.info('重置完成')
                server_obj.disconnect()

                return 1
            except Exception as e:
                server_obj.disconnect()
                log.info(e)

        if vm.is_powered_off() == True:
            try:
                vm.power_on()
                log.info('虚拟机%s 正在开机中。。。。' % (vm_name))
                server_obj.disconnect()

            except Exception as e:
                server_obj.disconnect()
                return 2
Ejemplo n.º 50
0
        print("done")
    except:
        print("connect to {} failed".format(args.host))
        exit(1)

    if args.file:
        vmxq = read_csv(args.file)

        while 1:
            if vmxq.qsize() > 0:
                d = vmxq.get()
                run_script()
            else:
                break

    elif args.show == 'datacenters':
        for k, v in vc.get_datacenters().items():
            print(k, v)

    elif args.show == 'datastores':
        for k, v in vc.get_datastores().items():
            print(k, v)

    elif args.show == 'vmxlist':
        for item in vc.get_registered_vms():
            print(item)
    else:
        run_script()

    vc.disconnect()
Ejemplo n.º 51
0
class Vmware:

    def __init__(self):
        self.host = config.vmware_host
        self.user = config.vmware_user
        self.pwd = config.vmware_pass
        self.connection = VIServer()
        self.connection.connect(self.host, self.user, self.pwd)
        self.props = VIProperty(self.connection, self.connection._do_service_content.CustomFieldsManager)
        self.custom_fields = dict((cf.key, cf.name) for cf in self.props.field)

    def get_servers(self):
        obj_type = 'HostSystem'
        return self._get_initial_data(relations.vmware_server, obj_type)

    def get_hypervisors(self):
        obj_type = 'HostSystem'
        return self._get_initial_data(relations.vmware_hypervisor, obj_type)

    def get_virtual_machines(self):
        obj_type = 'VirtualMachine'
        return self._get_initial_data(relations.vmware_virtual_machine, obj_type)

    def get_farm(self):
        obj_type = 'ClusterComputeResource'
        return self._get_initial_data(relations.vmware_farm, obj_type)

    def get_os_versions(self):
        hosts_os_versions = self._get_initial_data(relations.vmware_hosts_os_versions, 'HostSystem')
        vms_os_versions = self._get_initial_data(relations.vmware_vms_os_versions, 'VirtualMachine')
        os_versions = []
        hosts_os_versions.extend(vms_os_versions)
        for os_version in hosts_os_versions:
            if len(os_version.keys()) >= 2:
                if os_version not in os_versions:
                    os_versions.append(os_version)
        return os_versions

    def get_os_familys(self):
        hosts_os_familys = self.get_facts('summary.config.product.name', 'HostSystem')
        vms_os_familys = self.get_facts('guest.guestFamily', 'VirtualMachine')
        os_familys = []
        for os_family in hosts_os_familys | vms_os_familys:
            os_familys.append({'name': os_family})

        return os_familys

    def get_brands(self):
        facts_brand = self.get_facts('summary.hardware.vendor', 'HostSystem')
        brands = []
        for brand in facts_brand:
            brands.append({'name': brand})

        return brands

    def get_models(self):
        obj_type = 'HostSystem'
        return self._get_initial_data(relations.vmware_models, obj_type)

    def _get_initial_data(self, data_map, obj_type):
        properties = self.connection._retrieve_properties_traversal(property_names=data_map.values(), obj_type=obj_type)
        result = []
        for obj in properties:
            if not hasattr(obj, "PropSet"):
                continue
            host = {}
            result.append(host)
            for prop in obj.PropSet:
                for key, value in data_map.iteritems():
                    if prop.Name == value:
                        if prop.Name == "summary.hardware.otherIdentifyingInfo":
                            for license_info in prop.Val.HostSystemIdentificationInfo:
                                if 'Service tag of the system' in license_info.IdentifierType.Summary:
                                    host['serialnumber'] = license_info.IdentifierValue
                                elif 'Product ID:' in license_info.IdentifierValue:
                                    host['asset_number'] = license_info.IdentifierValue.split(": ")[1]
                        elif prop.Name == "customValue":
                            for annotation in prop.Val.CustomFieldValue:
                                try:
                                    host['description'] += str(self.custom_fields.get(annotation.Key)) + ": " + str(annotation.Value) + "\n"
                                except KeyError:
                                    host['description'] = str(self.custom_fields.get(annotation.Key)) + ": " + str(annotation.Value) + "\n"
                        elif prop.Name == "summary.hardware.memorySize":
                            host[key] = prop.Val / (1024 * 1024)
                        else:
                            try:
                                host[key] = prop.Val
                            except SyntaxError:
                                host[key] = None

        return result

    def get_relations(self, first_fact, second_fact, obj_type):
        result = {}
        data_map = {'first_fact': first_fact,
                    'second_fact': second_fact
                    }
        data = self._get_initial_data(data_map, obj_type)

        for item in data:
                try:
                    result[item['first_fact']] = item['second_fact']
                except KeyError:
                    continue

        return result

    def get_facts(self, fact_name, obj_type):
        data_map = {'fact_name': fact_name}
        data = self._get_initial_data(data_map, obj_type)
        result = set()

        for item in data:
                try:
                    result.add(item['fact_name'])
                except KeyError:
                    continue

        return result

    def __del__(self):
        self.connection.disconnect()
Ejemplo n.º 52
0
def get_stats():
    stats = dict()

    v = VCENTERLIST.split()

    for vcenter in v:

        logger('verb', "get_stats calls vcenter %s user %s" % (vcenter, USERNAME))
        server = VIServer()

        try:
            # Untrusted vSphere certificate bypass
            # SSL: CERTIFICATE_VERIFY_FAILED
            default_context = ssl._create_default_https_context
            ssl._create_default_https_context = ssl._create_unverified_context
            server.connect(vcenter, USERNAME, PASSWORD)
        except Exception:
            logger('warn', "failed to connect to %s" % (vcenter))
            continue

        # get datastores
        for ds, dsname in server.get_datastores().items():

            DatastoreCapacity = 0
            DatastoreFreespace = 0
            DatastoreUsagePercent = 0

            try:
                logger('verb', "get_stats calls Datastore metrics query on vcenter: %s for datastore: %s" % (vcenter, dsname))

                props = server._retrieve_properties_traversal(property_names=['name', 'summary.capacity', 'summary.freeSpace'], from_node=ds, obj_type="Datastore")

                for prop_set in props:
                    # mor = prop_set.Obj #in case you need it
                        for prop in prop_set.PropSet:
                            if prop.Name == "summary.capacity":
                                DatastoreCapacity = (prop.Val / 1048576)
                            elif prop.Name == "summary.freeSpace":
                                DatastoreFreespace = (prop.Val / 1048576)
            except Exception:
                logger('warn', "failed to get Datastore metrics value on vcenter: %s for datastore: %s" % (vcenter, dsname))

            DatastoreUsagePercent = (((DatastoreCapacity - DatastoreFreespace) * 100) / DatastoreCapacity) if DatastoreCapacity > 0 else 0

            metricnameZoneDatastoreCapacity = METRIC_DELIM.join([vcenter.lower(), "datastores",  dsname.lower(), 'datastorecapacity'])
            metricnameZoneDatastoreFreespace = METRIC_DELIM.join([vcenter.lower(), "datastores", dsname.lower(), 'datastorefreespace'])
            metricnameZoneDatastoreUsagePercent = METRIC_DELIM.join([vcenter.lower(), "datastores", dsname.lower(), 'datastoreusagepercent'])

            try:
                stats[metricnameZoneDatastoreCapacity] = DatastoreCapacity
                stats[metricnameZoneDatastoreFreespace] = DatastoreFreespace
                stats[metricnameZoneDatastoreUsagePercent] = DatastoreUsagePercent
            except (TypeError, ValueError):
                pass

        ZoneDatacentersCount = 0
        ZoneClustersCount = 0
        ZoneHostsCount = 0
        ZoneRunningVMS = 0
        ZoneStoppedVMS = 0
        ZoneTotalVMS = 0
        ZoneMemoryUsage = 0
        ZoneCpuUsage = 0
        ZoneTotalMemory = 0
        ZoneCpuTotal = 0

        logger('verb', "get_stats calls get_datacenters query on vcenter: %s" % (vcenter))
        datacenters = server.get_datacenters()
        logger('verb', "get_stats completed get_datacenters query on vcenter: %s" % (vcenter))
        ZoneDatacentersCount = len(datacenters)

        for d, dname in server.get_datacenters().items():

            if "." in dname:
                dname = dname.split(".")[0]

            DatacenterRunningVMS = 0
            DatacenterStoppedVMS = 0
            DatacenterTotalVMS = 0
            DatacenterClustersCount = 0
            DatacenterHostsCount = 0
            DatacenterMemoryUsage = 0
            DatacenterCpuUsage = 0
            DatacenterTotalMemory = 0
            DatacenterCpuTotal = 0

            logger('verb', "get_stats calls get_clusters query on vcenter: %s for datacenter: %s" % (vcenter, dname))
            clusters = server.get_clusters(d)
            logger('verb', "get_stats completed get_clusters query on vcenter: %s for datacenter: %s" % (vcenter, dname))
            DatacenterClustersCount = len(clusters)
            ZoneClustersCount = ZoneClustersCount + DatacenterClustersCount

            for c, cname in server.get_clusters(d).items():

                if "." in cname:
                    cname = cname.split(".")[0]

                ClusterMemoryUsage = 0
                ClusterCpuUsage = 0
                ClusterTotalMemory = 0
                ClusterCpuTotal = 0
                ClusterRunningVMS = 0
                ClusterStoppedVMS = 0
                ClusterTotalVMS = 0

                logger('verb', "get_stats calls get_hosts query on vcenter: %s for cluster: %s" % (vcenter, cname))
                hosts = server.get_hosts(c)
                logger('verb', "get_stats completed get_hosts query on vcenter: %s for cluster: %s" % (vcenter, cname))
                ClusterHostsCount = len(hosts)
                DatacenterHostsCount = DatacenterHostsCount + ClusterHostsCount
                ZoneHostsCount = ZoneHostsCount + DatacenterHostsCount

                for h, hname in server.get_hosts(c).items():

                    HostMemoryUsage = 0
                    HostCpuUsage = 0
                    HostTotalMemory = 0
                    HostNumCpuCores = 0
                    HostMhzPerCore = 0
                    HostStatus = ''

                    if "." in hname:
                        hname = hname.split(".")[0]

                    try:
                        logger('verb', "get_stats calls Host CPU and Memory metrics query on vcenter: %s for host: %s" % (vcenter, hname))

                        props = server._retrieve_properties_traversal(property_names=['name', 'summary.overallStatus', 'summary.quickStats.overallMemoryUsage', 'summary.quickStats.overallCpuUsage', 'summary.hardware.memorySize', 'summary.hardware.numCpuCores', 'summary.hardware.cpuMhz'], from_node=h, obj_type="HostSystem")

                        for prop_set in props:
                            # mor = prop_set.Obj #in case you need it
                            for prop in prop_set.PropSet:
                                if prop.Name == "summary.quickStats.overallMemoryUsage":
                                    HostMemoryUsage = prop.Val
                                elif prop.Name == "summary.quickStats.overallCpuUsage":
                                    HostCpuUsage = prop.Val
                                elif prop.Name == "summary.hardware.memorySize":
                                    HostTotalMemory = (prop.Val / 1048576)
                                elif prop.Name == "summary.hardware.numCpuCores":
                                    HostNumCpuCores = prop.Val
                                elif prop.Name == "summary.hardware.cpuMhz":
                                    HostMhzPerCore = prop.Val
                                elif prop.Name == "summary.overallStatus":
                                    HostStatus = prop.Val
                                    if HostStatus == "green":
                                        HostStatus = 0
                                    elif HostStatus == "gray":
                                        HostStatus = 1
                                    elif HostStatus == "yellow":
                                        HostStatus = 2
                                    elif HostStatus == "red":
                                        HostStatus = 3
                    except Exception:
                        logger('warn', "failed to get Host CPU and Memory metrics value on vcenter: %s for host: %s" % (vcenter, hname))

                    try:
                        logger('verb', "get_stats calls HostRunningVMS query on vcenter: %s for host: %s" % (vcenter, hname))
                        HostRunningVMS = len(server.get_registered_vms(h, status='poweredOn'))
                    except Exception:
                        logger('warn', "failed to get nb of running VMS value on %s" % (hname))
                    try:
                        logger('verb', "get_stats calls HostStoppedVMS query on vcenter: %s for host: %s" % (vcenter, hname))
                        HostStoppedVMS = len(server.get_registered_vms(h, status='poweredOff'))
                    except Exception:
                        logger('warn', "failed to get nb of stopped VMS value on %s" % (hname))
                    try:
                        logger('verb', "get_stats calls HostTotalVMS query on vcenter: %s for host: %s" % (vcenter, hname))
                        HostTotalVMS = len(server.get_registered_vms(h))
                    except Exception:
                        logger('warn', "failed to get all VMS count on %s" % (hname))

                    HostCpuTotal = (HostNumCpuCores * HostMhzPerCore)
                    HostMemoryUsagePercent = ((HostMemoryUsage * 100) / HostTotalMemory)
                    HostCpuUsagePercent = ((HostCpuUsage * 100) / HostCpuTotal)

                    metricnameHostStatus = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hoststatus'])
                    metricnameHostMemoryUsagePercent = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hostmemoryusagepercent'])
                    metricnameHostCpuUsagePercent = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hostcpuusagepercent'])
                    metricnameHostMemoryUsage = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hostmemoryusage'])
                    metricnameHostCpuUsage = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hostcpuusage'])
                    metricnameHostTotalMemory = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hosttotalmemory'])
                    metricnameHostCpuTotal = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hostcputotal'])
                    metricnameHostRunningVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hostrunningvms'])
                    metricnameHostStoppedVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hoststoppedvms'])
                    metricnameHostTotalVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hosttotalvms'])

                    ClusterMemoryUsage = ClusterMemoryUsage + HostMemoryUsage
                    ClusterCpuUsage = ClusterCpuUsage + HostCpuUsage
                    ClusterTotalMemory = ClusterTotalMemory + HostTotalMemory
                    ClusterCpuTotal = ClusterCpuTotal + HostCpuTotal
                    ClusterRunningVMS = ClusterRunningVMS + HostRunningVMS
                    ClusterStoppedVMS = ClusterStoppedVMS + HostStoppedVMS
                    ClusterTotalVMS = ClusterTotalVMS + HostTotalVMS
                    ClusterMemoryUsagePercent = ((ClusterMemoryUsage * 100) / ClusterTotalMemory)
                    ClusterCpuUsagePercent = ((ClusterCpuUsage * 100) / ClusterCpuTotal)

                    try:
                        stats[metricnameHostStatus] = HostStatus
                        stats[metricnameHostMemoryUsage] = HostMemoryUsage
                        stats[metricnameHostCpuUsage] = HostCpuUsage
                        stats[metricnameHostTotalMemory] = HostTotalMemory
                        stats[metricnameHostCpuUsagePercent] = HostCpuUsagePercent
                        stats[metricnameHostMemoryUsagePercent] = HostMemoryUsagePercent
                        stats[metricnameHostCpuTotal] = HostCpuTotal
                        stats[metricnameHostRunningVMS] = HostRunningVMS
                        stats[metricnameHostStoppedVMS] = HostStoppedVMS
                        stats[metricnameHostTotalVMS] = HostTotalVMS
                    except (TypeError, ValueError):
                        pass

                DatacenterRunningVMS = DatacenterRunningVMS + ClusterRunningVMS
                DatacenterStoppedVMS = DatacenterStoppedVMS + ClusterStoppedVMS
                DatacenterTotalVMS = DatacenterTotalVMS + ClusterTotalVMS
                DatacenterMemoryUsage = DatacenterMemoryUsage + ClusterMemoryUsage
                DatacenterCpuUsage = DatacenterCpuUsage + ClusterCpuUsage
                DatacenterTotalMemory = DatacenterTotalMemory + ClusterTotalMemory
                DatacenterCpuTotal = DatacenterCpuTotal + ClusterCpuTotal
                DatacenterMemoryUsagePercent = ((DatacenterMemoryUsage * 100) / DatacenterTotalMemory)
                DatacenterCpuUsagePercent = ((DatacenterCpuUsage * 100) / DatacenterCpuTotal)

                metricnameClusterRunningVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clusterrunningvms'])
                metricnameClusterStoppedVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clusterstoppedvms'])
                metricnameClusterTotalVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustertotalvms'])
                metricnameClusterMemoryUsage = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustermemoryusage'])
                metricnameClusterCpuUsage = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustercpuusage'])
                metricnameClusterTotalMemory = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustertotalmemory'])
                metricnameClusterCpuTotal = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustercputotal'])
                metricnameClusterMemoryUsagePercent = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustermemoryusagepercent'])
                metricnameClusterCpuUsagePercent = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustercpuusagepercent'])
                try:
                    stats[metricnameClusterRunningVMS] = ClusterRunningVMS
                    stats[metricnameClusterStoppedVMS] = ClusterStoppedVMS
                    stats[metricnameClusterTotalVMS] = ClusterTotalVMS
                    stats[metricnameClusterMemoryUsage] = ClusterMemoryUsage
                    stats[metricnameClusterCpuUsage] = ClusterCpuUsage
                    stats[metricnameClusterMemoryUsagePercent] = ClusterMemoryUsagePercent
                    stats[metricnameClusterCpuUsagePercent] = ClusterCpuUsagePercent
                    stats[metricnameClusterTotalMemory] = ClusterTotalMemory
                    stats[metricnameClusterCpuTotal] = ClusterCpuTotal
                except (TypeError, ValueError):
                    pass

            # post datacenter metrics count here

            ZoneRunningVMS = ZoneRunningVMS + DatacenterRunningVMS
            ZoneStoppedVMS = ZoneStoppedVMS + DatacenterStoppedVMS
            ZoneTotalVMS = ZoneTotalVMS + DatacenterTotalVMS
            ZoneMemoryUsage = ZoneMemoryUsage + DatacenterMemoryUsage
            ZoneCpuUsage = ZoneCpuUsage + DatacenterCpuUsage
            ZoneTotalMemory = ZoneTotalMemory + DatacenterTotalMemory
            ZoneCpuTotal = ZoneCpuTotal + DatacenterCpuTotal
            ZoneMemoryUsagePercent = ((ZoneMemoryUsage * 100) / ZoneTotalMemory)
            ZoneCpuUsagePercent = ((ZoneCpuUsage * 100) / ZoneCpuTotal)

            metricnameDatacenterRunningVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacenterrunningvms'])
            metricnameDatacenterStoppedVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacenterstoppedvms'])
            metricnameDatacenterTotalVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentertotalvms'])
            metricnameDatacenterMemoryUsage = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentermemoryusage'])
            metricnameDatacenterCpuUsage = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentercpuusage'])
            metricnameDatacenterMemoryUsagePercent = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentermemoryusagepercent'])
            metricnameDatacenterCpuUsagePercent = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentercpuusagepercent'])
            metricnameDatacenterTotalMemory = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentertotalmemory'])
            metricnameDatacenterCpuTotal = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentercputotal'])

            try:
                stats[metricnameDatacenterRunningVMS] = DatacenterRunningVMS
                stats[metricnameDatacenterStoppedVMS] = DatacenterStoppedVMS
                stats[metricnameDatacenterTotalVMS] = DatacenterTotalVMS
                stats[metricnameDatacenterMemoryUsage] = DatacenterMemoryUsage
                stats[metricnameDatacenterCpuUsage] = DatacenterCpuUsage
                stats[metricnameDatacenterMemoryUsagePercent] = DatacenterMemoryUsagePercent
                stats[metricnameDatacenterCpuUsagePercent] = DatacenterCpuUsagePercent
                stats[metricnameDatacenterTotalMemory] = DatacenterTotalMemory
                stats[metricnameDatacenterCpuTotal] = DatacenterCpuTotal
            except (TypeError, ValueError):
                pass

        # post zone metrics count here
        metricnameZoneRunningVMS = METRIC_DELIM.join([vcenter.lower(), 'zonerunningvms'])
        metricnameZoneStoppedVMS = METRIC_DELIM.join([vcenter.lower(), 'zonestoppedvms'])
        metricnameZoneTotalVMS = METRIC_DELIM.join([vcenter.lower(), 'zonetotalvms'])
        metricnameZoneMemoryUsage = METRIC_DELIM.join([vcenter.lower(), 'zonememoryusage'])
        metricnameZoneCpuUsage = METRIC_DELIM.join([vcenter.lower(), 'zonecpuusage'])
        metricnameZoneMemoryUsagePercent = METRIC_DELIM.join([vcenter.lower(), 'zonememoryusagepercent'])
        metricnameZoneCpuUsagePercent = METRIC_DELIM.join([vcenter.lower(), 'zonecpuusagepercent'])
        metricnameZoneTotalMemory = METRIC_DELIM.join([vcenter.lower(), 'zonetotalmemory'])
        metricnameZoneCpuTotal = METRIC_DELIM.join([vcenter.lower(), 'zonecputotal'])

        try:
            stats[metricnameZoneRunningVMS] = ZoneRunningVMS
            stats[metricnameZoneStoppedVMS] = ZoneStoppedVMS
            stats[metricnameZoneTotalVMS] = ZoneTotalVMS
            stats[metricnameZoneMemoryUsage] = ZoneMemoryUsage
            stats[metricnameZoneCpuUsage] = ZoneCpuUsage
            stats[metricnameZoneMemoryUsagePercent] = ZoneMemoryUsagePercent
            stats[metricnameZoneCpuUsagePercent] = ZoneCpuUsagePercent
            stats[metricnameZoneTotalMemory] = ZoneTotalMemory
            stats[metricnameZoneCpuTotal] = ZoneCpuTotal
        except (TypeError, ValueError):
            pass

        metricnameZoneDatacentersCount = METRIC_DELIM.join([vcenter.lower(), 'zonedatacenterscount'])
        metricnameZoneClustersCount = METRIC_DELIM.join([vcenter.lower(), 'zoneclusterscount'])
        metricnameZoneHostsCount = METRIC_DELIM.join([vcenter.lower(), 'zonehostscount'])

        try:
            stats[metricnameZoneDatacentersCount] = ZoneDatacentersCount
            stats[metricnameZoneClustersCount] = ZoneClustersCount
            stats[metricnameZoneHostsCount] = ZoneHostsCount
        except (TypeError, ValueError):
            pass

        server.disconnect()
    return stats
Ejemplo n.º 53
0
def get_host_info(host_ip,host_name,host_password):
    hosts_dict_data = []
    server = VIServer()
    server.connect(host_ip, host_name, host_password)
    #print 'VC connect successful...'
    #DebugInfo.objects.create(text_info='VC connect successful...')

    for d, hname in server.get_hosts().items():

        HostMemoryUsage = 0
        HostCpuUsage = 0
        HostTotalMemory = 0
        HostNumCpuCores = 0
        HostMhzPerCore = 0
        HostStatus = ''

        props = server._retrieve_properties_traversal(property_names=[
            'name',
            'summary.overallStatus',
            'summary.quickStats.overallMemoryUsage',
            'summary.quickStats.overallCpuUsage',
            'summary.hardware.memorySize',
            'summary.hardware.numCpuCores',
            'summary.hardware.cpuMhz',
            'hardware.biosInfo',
            'hardware.systemInfo',
            'summary.runtime.healthSystemRuntime.hardwareStatusInfo.cpuStatusInfo',
            'summary.runtime.healthSystemRuntime.hardwareStatusInfo.memoryStatusInfo',
            'summary.runtime.healthSystemRuntime.hardwareStatusInfo.storageStatusInfo'
        ], from_node=d, obj_type="HostSystem")

        for prop_set in props:
            # mor = prop_set.Obj #in case you need it
            for prop in prop_set.PropSet:
                if prop.Name == "summary.quickStats.overallMemoryUsage":
                    HostMemoryUsage = prop.Val
                elif prop.Name == "summary.quickStats.overallCpuUsage":
                    HostCpuUsage = prop.Val
                elif prop.Name == "summary.hardware.memorySize":
                    HostTotalMemory = (prop.Val / 1048576)
                elif prop.Name == "summary.hardware.numCpuCores":
                    HostNumCpuCores = prop.Val
                elif prop.Name == "summary.hardware.cpuMhz":
                    HostMhzPerCore = prop.Val
                elif prop.Name == "summary.overallStatus":
                    HostStatus = prop.Val
                    if HostStatus == "green":
                        HostStatus = 0
                    elif HostStatus == "gray":
                        HostStatus = 1
                    elif HostStatus == "yellow":
                        HostStatus = 2
                    elif HostStatus == "red":
                        HostStatus = 3
                elif prop.Name == "hardware.biosInfo":
                    HostBiosInfo = prop.Val.__dict__['_biosVersion']
                # print HostBiosInfo
                elif prop.Name == "hardware.systemInfo":
                    HostSystemInfo = prop.Val.__dict__
                    HostType = HostSystemInfo['_model']
                elif prop.Name == "summary.runtime.healthSystemRuntime.hardwareStatusInfo.cpuStatusInfo":
                    HostHealthInfo_cpu = prop.Val.__dict__
                    for i in HostHealthInfo_cpu['_HostHardwareElementInfo']:
                        cpu = i.__dict__
                        cpu1 = cpu['_status'].__dict__
                        HostCPUHealthInfo = cpu1['_label']
                elif prop.Name == "summary.runtime.healthSystemRuntime.hardwareStatusInfo.memoryStatusInfo":
                    HostHealthInfo_memory = prop.Val.__dict__
                    for i in HostHealthInfo_memory['_HostHardwareElementInfo']:
                        mem = i.__dict__
                        mem1 = mem['_status'].__dict__
                        # print mem1
                        HostMemHealthInfo = mem1['_label']
                        # print HostMemHealthInfo
                elif prop.Name == "summary.runtime.healthSystemRuntime.hardwareStatusInfo.storageStatusInfo":
                    HostHealthInfo_storage = prop.Val.__dict__

        HostRunningVMS = len(server.get_registered_vms(d, status='poweredOn'))
        HostStoppedVMS = len(server.get_registered_vms(d, status='poweredOff'))
        HostTotalVMS = len(server.get_registered_vms(d))
        HostCpuTotal = (HostNumCpuCores * HostMhzPerCore)
        HostMemoryUsagePercent = round((HostMemoryUsage * 100) / HostTotalMemory,2)
        HostCpuUsagePercent = round(((HostCpuUsage * 100) / HostCpuTotal),2)

        hosts_dict = {'hostnumber':d, 'hostname': hname.lower(), 'hoststatus': HostStatus, 'hostmemoryusage': HostMemoryUsage,
                      'hostcpuusage': HostCpuUsage, 'hosttotalmemory': HostTotalMemory, 'hostcputotal': HostCpuTotal,
                      'hostmemoryusagepercent': HostMemoryUsagePercent, 'hostcpuusagepercent': HostCpuUsagePercent,
                      'hostrunningvms': HostRunningVMS, 'hoststoppedvms': HostStoppedVMS, 'hosttotalvms': HostTotalVMS,
                      'hostbiosinfo': HostBiosInfo, 'hosttype': HostType, 'hostcpuhealthinfo': HostCPUHealthInfo}
        hosts_dict_data.append(hosts_dict)

    server.disconnect()
    return hosts_dict_data
print_verbose('Connected to server %s' % server)
print_verbose('Server type: %s' % con.get_server_type())
print_verbose('API version: %s' % con.get_api_version())

if allvms:
    vms = con.get_registered_vms(None, None, None, 'poweredOn', None)
    for vmpath in vms:
        print_verbose('================================================================================')
        vm = con.get_vm_by_path(vmpath)
        vmname = vm.get_property('name')
        ip = find_ip(vm,ipv6)
        if ip:
            print '%s : %s' % (vmname,ip)
        else:
            print 'ERROR: IP for VM %s not found' % vmname
else:
    print_verbose('================================================================================')
    print_verbose('Trying to find IP for VM %s' % vmname)
    vm = find_vm(vmname)
    if vm:
        ip = find_ip(vm,ipv6)
        if ip:
            print '%s : %s' % (vmname,ip)
        else:
            print 'ERROR: IP for VM %s not found' % vmname
    else:
        print 'ERROR: %s not found' % vmname

# Disconnecting from server
con.disconnect()
try:
	sock.connect( (CARBON_SERVER,CARBON_PORT) )
except:
  print "Couldn't connect to %(server)s on port %(port)d, is carbon-agent.py running?" % { 'server':CARBON_SERVER, 'port':CARBON_PORT }
  sys.exit(1)
try:
	server.connect(HOST, USER, PASSWORD)
except:
	print "Unable to connect to vsphere server"
	sys.exit(1)
pm = server.get_performance_manager()

while True:
	lines = []
	for dc_mor, dc_name in server.get_datacenters().items():
		now = int(time.time())
		datastores = server.get_datastores(dc_mor)
		for ds_mor, ds_name in datastores.items():
			gphDSName = ds_name.replace('.', '_')
			gphDSName = gphDSName.replace(' ', '_')
			props = VIProperty(server, ds_mor)
			lines.append(prefix + dc_name + ".datastores." + props.summary.type + "." + gphDSName + ".capacity " + str(props.summary.capacity) + " " + str(now))
                	lines.append(prefix + dc_name + ".datastores." + props.summary.type + "." + gphDSName + ".freespace " + str(props.summary.freeSpace) + " " +str(now))
			if hasattr(props.summary, "uncommitted"):
				lines.append(prefix + dc_name + ".datastores." + props.summary.type + "." + gphDSName + ".uncommitted " + str(props.summary.uncommitted) + " " + str(now))
	message = '\n'.join(lines) + '\n'
	sock.sendall(message)
	print message
	time.sleep(delay)
server.disconnect()
Ejemplo n.º 56
0
def get_stats():
    stats = dict()

    v = VCENTERLIST.split()

    for vcenter in v:

        logger('verb', "get_stats calls vcenter %s user %s" % (vcenter, USERNAME))
        server = VIServer()

        try:
            server.connect(vcenter, USERNAME, PASSWORD)
        except Exception:
            logger('warn', "failed to connect to %s" % (vcenter))
            continue

        # get datastores
        for ds, dsname in server.get_datastores().items():

            DatastoreCapacity = 0
            DatastoreFreespace = 0
            DatastoreUsagePercent = 0

            try:
                logger('verb', "get_stats calls Datastore metrics query on vcenter: %s for datastore: %s" % (vcenter, dsname))

                props = server._retrieve_properties_traversal(property_names=['name', 'summary.capacity', 'summary.freeSpace'], from_node=ds, obj_type="Datastore")

                for prop_set in props:
                    # mor = prop_set.Obj #in case you need it
                        for prop in prop_set.PropSet:
                            if prop.Name == "summary.capacity":
                                DatastoreCapacity = (prop.Val / 1048576)
                            elif prop.Name == "summary.freeSpace":
                                DatastoreFreespace = (prop.Val / 1048576)
            except Exception:
                logger('warn', "failed to get Datastore metrics value on vcenter: %s for datastore: %s" % (vcenter, dsname))

            DatastoreUsagePercent = (((DatastoreCapacity - DatastoreFreespace) * 100) / DatastoreCapacity)

            metricnameZoneDatastoreCapacity = METRIC_DELIM.join([vcenter.lower(), "datastores",  dsname.lower(), 'datastorecapacity'])
            metricnameZoneDatastoreFreespace = METRIC_DELIM.join([vcenter.lower(), "datastores", dsname.lower(), 'datastorefreespace'])
            metricnameZoneDatastoreUsagePercent = METRIC_DELIM.join([vcenter.lower(), "datastores", dsname.lower(), 'datastoreusagepercent'])

            try:
                stats[metricnameZoneDatastoreCapacity] = DatastoreCapacity
                stats[metricnameZoneDatastoreFreespace] = DatastoreFreespace
                stats[metricnameZoneDatastoreUsagePercent] = DatastoreUsagePercent
            except (TypeError, ValueError):
                pass

        ZoneDatacentersCount = 0
        ZoneClustersCount = 0
        ZoneHostsCount = 0
        ZoneRunningVMS = 0
        ZoneStoppedVMS = 0
        ZoneTotalVMS = 0
        ZoneMemoryUsage = 0
        ZoneCpuUsage = 0
        ZoneTotalMemory = 0
        ZoneCpuTotal = 0

        logger('verb', "get_stats calls get_datacenters query on vcenter: %s" % (vcenter))
        datacenters = server.get_datacenters()
        logger('verb', "get_stats completed get_datacenters query on vcenter: %s" % (vcenter))
        ZoneDatacentersCount = len(datacenters)

        for d, dname in server.get_datacenters().items():

            if "." in dname:
                dname = dname.split(".")[0]

            DatacenterRunningVMS = 0
            DatacenterStoppedVMS = 0
            DatacenterTotalVMS = 0
            DatacenterClustersCount = 0
            DatacenterHostsCount = 0
            DatacenterMemoryUsage = 0
            DatacenterCpuUsage = 0
            DatacenterTotalMemory = 0
            DatacenterCpuTotal = 0

            logger('verb', "get_stats calls get_clusters query on vcenter: %s for datacenter: %s" % (vcenter, dname))
            clusters = server.get_clusters(d)
            logger('verb', "get_stats completed get_clusters query on vcenter: %s for datacenter: %s" % (vcenter, dname))
            DatacenterClustersCount = len(clusters)
            ZoneClustersCount = ZoneClustersCount + DatacenterClustersCount

            for c, cname in server.get_clusters(d).items():

                if "." in cname:
                    cname = cname.split(".")[0]

                ClusterMemoryUsage = 0
                ClusterCpuUsage = 0
                ClusterTotalMemory = 0
                ClusterCpuTotal = 0
                ClusterRunningVMS = 0
                ClusterStoppedVMS = 0
                ClusterTotalVMS = 0

                logger('verb', "get_stats calls get_hosts query on vcenter: %s for cluster: %s" % (vcenter, cname))
                hosts = server.get_hosts(c)
                logger('verb', "get_stats completed get_hosts query on vcenter: %s for cluster: %s" % (vcenter, cname))
                ClusterHostsCount = len(hosts)
                DatacenterHostsCount = DatacenterHostsCount + ClusterHostsCount
                ZoneHostsCount = ZoneHostsCount + DatacenterHostsCount

                for h, hname in server.get_hosts(c).items():

                    HostMemoryUsage = 0
                    HostCpuUsage = 0
                    HostTotalMemory = 0
                    HostNumCpuCores = 0
                    HostMhzPerCore = 0
                    HostStatus = ''

                    if "." in hname:
                        hname = hname.split(".")[0]

                    try:
                        logger('verb', "get_stats calls Host CPU and Memory metrics query on vcenter: %s for host: %s" % (vcenter, hname))

                        props = server._retrieve_properties_traversal(property_names=['name', 'summary.overallStatus', 'summary.quickStats.overallMemoryUsage', 'summary.quickStats.overallCpuUsage', 'summary.hardware.memorySize', 'summary.hardware.numCpuCores', 'summary.hardware.cpuMhz'], from_node=h, obj_type="HostSystem")

                        for prop_set in props:
                            # mor = prop_set.Obj #in case you need it
                            for prop in prop_set.PropSet:
                                if prop.Name == "summary.quickStats.overallMemoryUsage":
                                    HostMemoryUsage = prop.Val
                                elif prop.Name == "summary.quickStats.overallCpuUsage":
                                    HostCpuUsage = prop.Val
                                elif prop.Name == "summary.hardware.memorySize":
                                    HostTotalMemory = (prop.Val / 1048576)
                                elif prop.Name == "summary.hardware.numCpuCores":
                                    HostNumCpuCores = prop.Val
                                elif prop.Name == "summary.hardware.cpuMhz":
                                    HostMhzPerCore = prop.Val
                                elif prop.Name == "summary.overallStatus":
                                    HostStatus = prop.Val
                                    if HostStatus == "green":
                                        HostStatus = 0
                                    elif HostStatus == "gray":
                                        HostStatus = 1
                                    elif HostStatus == "yellow":
                                        HostStatus = 2
                                    elif HostStatus == "red":
                                        HostStatus = 3
                    except Exception:
                        logger('warn', "failed to get Host CPU and Memory metrics value on vcenter: %s for host: %s" % (vcenter, hname))

                    try:
                        logger('verb', "get_stats calls HostRunningVMS query on vcenter: %s for host: %s" % (vcenter, hname))
                        HostRunningVMS = len(server.get_registered_vms(h, status='poweredOn'))
                    except Exception:
                        logger('warn', "failed to get nb of running VMS value on %s" % (hname))
                    try:
                        logger('verb', "get_stats calls HostStoppedVMS query on vcenter: %s for host: %s" % (vcenter, hname))
                        HostStoppedVMS = len(server.get_registered_vms(h, status='poweredOff'))
                    except Exception:
                        logger('warn', "failed to get nb of stopped VMS value on %s" % (hname))
                    try:
                        logger('verb', "get_stats calls HostTotalVMS query on vcenter: %s for host: %s" % (vcenter, hname))
                        HostTotalVMS = len(server.get_registered_vms(h))
                    except Exception:
                        logger('warn', "failed to get all VMS count on %s" % (hname))

                    HostCpuTotal = (HostNumCpuCores * HostMhzPerCore)
                    HostMemoryUsagePercent = ((HostMemoryUsage * 100) / HostTotalMemory)
                    HostCpuUsagePercent = ((HostCpuUsage * 100) / HostCpuTotal)

                    metricnameHostStatus = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hoststatus'])
                    metricnameHostMemoryUsagePercent = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hostmemoryusagepercent'])
                    metricnameHostCpuUsagePercent = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hostcpuusagepercent'])
                    metricnameHostMemoryUsage = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hostmemoryusage'])
                    metricnameHostCpuUsage = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hostcpuusage'])
                    metricnameHostTotalMemory = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hosttotalmemory'])
                    metricnameHostCpuTotal = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hostcputotal'])
                    metricnameHostRunningVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hostrunningvms'])
                    metricnameHostStoppedVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hoststoppedvms'])
                    metricnameHostTotalVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), hname.lower(), 'hosttotalvms'])

                    ClusterMemoryUsage = ClusterMemoryUsage + HostMemoryUsage
                    ClusterCpuUsage = ClusterCpuUsage + HostCpuUsage
                    ClusterTotalMemory = ClusterTotalMemory + HostTotalMemory
                    ClusterCpuTotal = ClusterCpuTotal + HostCpuTotal
                    ClusterRunningVMS = ClusterRunningVMS + HostRunningVMS
                    ClusterStoppedVMS = ClusterStoppedVMS + HostStoppedVMS
                    ClusterTotalVMS = ClusterTotalVMS + HostTotalVMS
                    ClusterMemoryUsagePercent = ((ClusterMemoryUsage * 100) / ClusterTotalMemory)
                    ClusterCpuUsagePercent = ((ClusterCpuUsage * 100) / ClusterCpuTotal)

                    try:
                        stats[metricnameHostStatus] = HostStatus
                        stats[metricnameHostMemoryUsage] = HostMemoryUsage
                        stats[metricnameHostCpuUsage] = HostCpuUsage
                        stats[metricnameHostTotalMemory] = HostTotalMemory
                        stats[metricnameHostCpuUsagePercent] = HostCpuUsagePercent
                        stats[metricnameHostMemoryUsagePercent] = HostMemoryUsagePercent
                        stats[metricnameHostCpuTotal] = HostCpuTotal
                        stats[metricnameHostRunningVMS] = HostRunningVMS
                        stats[metricnameHostStoppedVMS] = HostStoppedVMS
                        stats[metricnameHostTotalVMS] = HostTotalVMS
                    except (TypeError, ValueError):
                        pass

                DatacenterRunningVMS = DatacenterRunningVMS + ClusterRunningVMS
                DatacenterStoppedVMS = DatacenterStoppedVMS + ClusterStoppedVMS
                DatacenterTotalVMS = DatacenterTotalVMS + ClusterTotalVMS
                DatacenterMemoryUsage = DatacenterMemoryUsage + ClusterMemoryUsage
                DatacenterCpuUsage = DatacenterCpuUsage + ClusterCpuUsage
                DatacenterTotalMemory = DatacenterTotalMemory + ClusterTotalMemory
                DatacenterCpuTotal = DatacenterCpuTotal + ClusterCpuTotal
                DatacenterMemoryUsagePercent = ((DatacenterMemoryUsage * 100) / DatacenterTotalMemory)
                DatacenterCpuUsagePercent = ((DatacenterCpuUsage * 100) / DatacenterCpuTotal)

                metricnameClusterRunningVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clusterrunningvms'])
                metricnameClusterStoppedVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clusterstoppedvms'])
                metricnameClusterTotalVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustertotalvms'])
                metricnameClusterMemoryUsage = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustermemoryusage'])
                metricnameClusterCpuUsage = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustercpuusage'])
                metricnameClusterTotalMemory = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustertotalmemory'])
                metricnameClusterCpuTotal = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustercputotal'])
                metricnameClusterMemoryUsagePercent = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustermemoryusagepercent'])
                metricnameClusterCpuUsagePercent = METRIC_DELIM.join([vcenter.lower(), dname.lower(), cname.lower(), 'clustercpuusagepercent'])
                try:
                    stats[metricnameClusterRunningVMS] = ClusterRunningVMS
                    stats[metricnameClusterStoppedVMS] = ClusterStoppedVMS
                    stats[metricnameClusterTotalVMS] = ClusterTotalVMS
                    stats[metricnameClusterMemoryUsage] = ClusterMemoryUsage
                    stats[metricnameClusterCpuUsage] = ClusterCpuUsage
                    stats[metricnameClusterMemoryUsagePercent] = ClusterMemoryUsagePercent
                    stats[metricnameClusterCpuUsagePercent] = ClusterCpuUsagePercent
                    stats[metricnameClusterTotalMemory] = ClusterTotalMemory
                    stats[metricnameClusterCpuTotal] = ClusterCpuTotal
                except (TypeError, ValueError):
                    pass

            # post datacenter metrics count here

            ZoneRunningVMS = ZoneRunningVMS + DatacenterRunningVMS
            ZoneStoppedVMS = ZoneStoppedVMS + DatacenterStoppedVMS
            ZoneTotalVMS = ZoneTotalVMS + DatacenterTotalVMS
            ZoneMemoryUsage = ZoneMemoryUsage + DatacenterMemoryUsage
            ZoneCpuUsage = ZoneCpuUsage + DatacenterCpuUsage
            ZoneTotalMemory = ZoneTotalMemory + DatacenterTotalMemory
            ZoneCpuTotal = ZoneCpuTotal + DatacenterCpuTotal
            ZoneMemoryUsagePercent = ((ZoneMemoryUsage * 100) / ZoneTotalMemory)
            ZoneCpuUsagePercent = ((ZoneCpuUsage * 100) / ZoneCpuTotal)

            metricnameDatacenterRunningVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacenterrunningvms'])
            metricnameDatacenterStoppedVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacenterstoppedvms'])
            metricnameDatacenterTotalVMS = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentertotalvms'])
            metricnameDatacenterMemoryUsage = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentermemoryusage'])
            metricnameDatacenterCpuUsage = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentercpuusage'])
            metricnameDatacenterMemoryUsagePercent = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentermemoryusagepercent'])
            metricnameDatacenterCpuUsagePercent = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentercpuusagepercent'])
            metricnameDatacenterTotalMemory = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentertotalmemory'])
            metricnameDatacenterCpuTotal = METRIC_DELIM.join([vcenter.lower(), dname.lower(), 'datacentercputotal'])

            try:
                stats[metricnameDatacenterRunningVMS] = DatacenterRunningVMS
                stats[metricnameDatacenterStoppedVMS] = DatacenterStoppedVMS
                stats[metricnameDatacenterTotalVMS] = DatacenterTotalVMS
                stats[metricnameDatacenterMemoryUsage] = DatacenterMemoryUsage
                stats[metricnameDatacenterCpuUsage] = DatacenterCpuUsage
                stats[metricnameDatacenterMemoryUsagePercent] = DatacenterMemoryUsagePercent
                stats[metricnameDatacenterCpuUsagePercent] = DatacenterCpuUsagePercent
                stats[metricnameDatacenterTotalMemory] = DatacenterTotalMemory
                stats[metricnameDatacenterCpuTotal] = DatacenterCpuTotal
            except (TypeError, ValueError):
                pass

        # post zone metrics count here
        metricnameZoneRunningVMS = METRIC_DELIM.join([vcenter.lower(), 'zonerunningvms'])
        metricnameZoneStoppedVMS = METRIC_DELIM.join([vcenter.lower(), 'zonestoppedvms'])
        metricnameZoneTotalVMS = METRIC_DELIM.join([vcenter.lower(), 'zonetotalvms'])
        metricnameZoneMemoryUsage = METRIC_DELIM.join([vcenter.lower(), 'zonememoryusage'])
        metricnameZoneCpuUsage = METRIC_DELIM.join([vcenter.lower(), 'zonecpuusage'])
        metricnameZoneMemoryUsagePercent = METRIC_DELIM.join([vcenter.lower(), 'zonememoryusagepercent'])
        metricnameZoneCpuUsagePercent = METRIC_DELIM.join([vcenter.lower(), 'zonecpuusagepercent'])
        metricnameZoneTotalMemory = METRIC_DELIM.join([vcenter.lower(), 'zonetotalmemory'])
        metricnameZoneCpuTotal = METRIC_DELIM.join([vcenter.lower(), 'zonecputotal'])

        try:
            stats[metricnameZoneRunningVMS] = ZoneRunningVMS
            stats[metricnameZoneStoppedVMS] = ZoneStoppedVMS
            stats[metricnameZoneTotalVMS] = ZoneTotalVMS
            stats[metricnameZoneMemoryUsage] = ZoneMemoryUsage
            stats[metricnameZoneCpuUsage] = ZoneCpuUsage
            stats[metricnameZoneMemoryUsagePercent] = ZoneMemoryUsagePercent
            stats[metricnameZoneCpuUsagePercent] = ZoneCpuUsagePercent
            stats[metricnameZoneTotalMemory] = ZoneTotalMemory
            stats[metricnameZoneCpuTotal] = ZoneCpuTotal
        except (TypeError, ValueError):
            pass

        metricnameZoneDatacentersCount = METRIC_DELIM.join([vcenter.lower(), 'zonedatacenterscount'])
        metricnameZoneClustersCount = METRIC_DELIM.join([vcenter.lower(), 'zoneclusterscount'])
        metricnameZoneHostsCount = METRIC_DELIM.join([vcenter.lower(), 'zonehostscount'])

        try:
            stats[metricnameZoneDatacentersCount] = ZoneDatacentersCount
            stats[metricnameZoneClustersCount] = ZoneClustersCount
            stats[metricnameZoneHostsCount] = ZoneHostsCount
        except (TypeError, ValueError):
            pass

        server.disconnect()
    return stats
Ejemplo n.º 57
0
        if vmname_ip[7] == "linux":
            vm.send_file("/var/www/html/scripts/misc/setnetwork.sh",
                         r"/root/setnetwork.sh",
                         overwrite=True)
            vm.start_process("/bin/chmod", args=["+x", "/root/setnetwork.sh"])
            vm.start_process(
                "/root/setnetwork.sh",
                args=[vmname_ip[1], vmname_ip[2], vmname_ip[3], vmname_ip[4]],
                cwd="/root")
            ipdict[vmname_ip[0]] = "SUCCESS"

        elif vmname_ip[7] == "windows":
            vm.send_file("/var/www/html/scripts/misc/winautoip.bat",
                         r"C:\Users\Administrator\Desktop\winautoip.bat",
                         overwrite=True)
            vm.start_process(
                "C:\Users\Administrator\Desktop\winautoip.bat",
                args=[vmname_ip[1], vmname_ip[2], vmname_ip[3], vmname_ip[4]])
            ipdict[vmname_ip[0]] = "SUCCESS"

    except VIException as inst:
        #print inst
        ipdict["error"] = str(inst)
    print json.dumps(ipdict)


if args.setip:
    setip(args.setip)

server.disconnect()
Ejemplo n.º 58
0
class VMWareSystem(MgmtSystemAPIBase):
    """Client to Vsphere API

    This class piggy backs off pysphere.

    Benefits of pysphere:
      - Don't need intimate knowledge w/ vsphere api itself.
    Detriments of pysphere:
      - Response often are not detailed enough.

    Args:
        hostname: The hostname of the system.
        username: The username to connect with.
        password: The password to connect with.

    Returns: A :py:class:`VMWareSystem` object.
    """
    _api = None

    _stats_available = {
        'num_vm': lambda self: len(self.list_vm()),
        'num_host': lambda self: len(self.list_host()),
        'num_cluster': lambda self: len(self.list_cluster()),
        'num_template': lambda self: len(self.list_template()),
        'num_datastore': lambda self: len(self.list_datastore()),
    }

    def __init__(self, hostname, username, password, **kwargs):
        self.hostname = hostname
        self.username = username
        self.password = password
        self.api = VIServer()

    @property
    def api(self):
        # wrap calls to the API with a keepalive check, reconnect if needed
        try:
            keepalive = self._api.keep_session_alive()
            if not keepalive:
                logger.debug('The connection to %s "%s" timed out' %
                    (type(self).__name__, self.hostname))
        except VIException as ex:
            if ex.fault == "Not Connected":
                # set this to trigger a connection below
                keepalive = None
            else:
                raise

        if not keepalive:
            self._connect()
        return self._api

    @api.setter
    def api(self, api):
        # Allow for changing the api object via public setter
        self._api = api

    def _connect(self):
        # Since self.api calls _connect, connect via self._api to prevent implosion
        logger.debug('Connecting to %s "%s"' % (type(self).__name__, self.hostname))
        self._api.connect(self.hostname, self.username, self.password)

    def _get_vm(self, vm_name=None):
        """ Returns a vm from the VI object.

        Args:
            vm_name: The name of the VM.

        Returns: a pysphere object.
        """
        if vm_name is None:
            raise Exception('Could not find a VM named %s.' % vm_name)
        else:
            try:
                vm = self.api.get_vm_by_name(vm_name)
                return vm
            except VIException as ex:
                raise Exception(ex)

    def does_vm_exist(self, name):
        """ Checks if a vm exists or not.

        Args:
            name: The name of the requested vm.
        Returns: A boolean, ``True`` if the vm exists, ``False`` if not.
        """
        try:
            self._get_vm(name)
            return True
        except Exception:
            return False

    def _get_resource_pool(self, resource_pool_name=None):
        """ Returns a resource pool MOR for a specified name.

        Args:
            resource_pool_name: The name of the resource pool.
        Returns: The MOR of the resource pool.
        """
        rps = self.api.get_resource_pools()
        for mor, path in rps.iteritems():
            if re.match('.*%s' % resource_pool_name, path):
                return mor
        # Just pick the first
        return rps.keys()[0]

    def get_ip_address(self, vm_name):
        """ Returns the first IP address for the selected VM.

        Args:
            vm_name: The name of the vm to obtain the IP for.
        Returns: A string containing the first found IP that isn't the loopback device.
        """
        vm = self._get_vm(vm_name)
        try:
            net_info, tc = wait_for(vm.get_property, ['net', False],
                                    fail_condition=None, delay=5, num_sec=600,
                                    message="get_ip_address from vsphere")
        except TimedOutError:
            net_info = None

        if net_info:
            ipv4_re = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'
            for ip in net_info[0]['ip_addresses']:
                if re.match(ipv4_re, ip) and ip != '127.0.0.1':
                    return ip
        return None

    def _get_list_vms(self, get_template=False):
        """ Obtains a list of all VMs on the system.

        Optional flag to obtain template names too.

        Args:
            get_template: A boolean describing if it should return template names also.
        Returns: A list of VMs.
        """
        template_or_vm_list = []

        props = self.api._retrieve_properties_traversal(property_names=['name', 'config.template'],
                                                        from_node=None,
                                                        obj_type=MORTypes.VirtualMachine)
        for prop in props:
            vm = None
            template = None
            for elem in prop.PropSet:
                if elem.Name == "name":
                    vm = elem.Val
                elif elem.Name == "config.template":
                    template = elem.Val
            if vm is None or template is None:
                continue
            if template == bool(get_template):
                template_or_vm_list.append(vm)
        return template_or_vm_list

    def start_vm(self, vm_name):
        vm = self._get_vm(vm_name)
        if vm.is_powered_on():
            return True
        else:
            vm.power_on()
            ack = vm.get_status()
            if ack == 'POWERED ON':
                return True
        return False

    def stop_vm(self, vm_name):
        vm = self._get_vm(vm_name)
        if vm.is_powered_off():
            return True
        else:
            vm.power_off()
            ack = vm.get_status()
            if ack == 'POWERED OFF':
                return True
        return False

    def delete_vm(self, vm_name):
        vm = self._get_vm(vm_name)

        if vm.is_powered_on():
            self.stop_vm(vm_name)

        # When pysphere moves up to 0.1.8, we can just do:
        # vm.destroy()
        request = VI.Destroy_TaskRequestMsg()
        _this = request.new__this(vm._mor)
        _this.set_attribute_type(vm._mor.get_attribute_type())
        request.set_element__this(_this)
        rtn = self.api._proxy.Destroy_Task(request)._returnval

        task = VITask(rtn, self.api)
        status = task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR])
        if status == task.STATE_SUCCESS:
            return True
        else:
            return False

    def create_vm(self, vm_name):
        raise NotImplementedError('This function has not yet been implemented.')

    def restart_vm(self, vm_name):
        if not self.stop_vm(vm_name):
            return False
        else:
            return self.start_vm(vm_name)

    def list_vm(self):
        return self._get_list_vms()

    def list_template(self):
        return self._get_list_vms(get_template=True)

    def list_flavor(self):
        raise NotImplementedError('This function is not supported on this platform.')

    def list_host(self):
        return self.api.get_hosts()

    def list_datastore(self):
        return self.api.get_datastores()

    def list_cluster(self):
        return self.api.get_clusters()

    def info(self):
        return '%s %s' % (self.api.get_server_type(), self.api.get_api_version())

    def disconnect(self):
        self.api.disconnect()

    def vm_status(self, vm_name):
        state = self._get_vm(vm_name).get_status()
        print "vm " + vm_name + " status is " + state
        return state

    def is_vm_running(self, vm_name):
        state = self.vm_status(vm_name)
        return "POWERED ON" == state

    def is_vm_stopped(self, vm_name):
        state = self.vm_status(vm_name)
        return "POWERED OFF" == state

    def is_vm_suspended(self, vm_name):
        state = self.vm_status(vm_name)
        return "SUSPENDED" == state

    def suspend_vm(self, vm_name):
        vm = self._get_vm(vm_name)
        if vm.is_powered_off():
            raise Exception('Could not suspend %s because it\'s not running.' % vm_name)
        else:
            vm.suspend()
            return self.is_vm_suspended(vm_name)

    def clone_vm(self):
        raise NotImplementedError('clone_vm not implemented.')

    def deploy_template(self, template, *args, **kwargs):
        if 'resourcepool' not in kwargs:
            kwargs['resourcepool'] = None
        vm = self._get_vm(template)
        if vm:
            vm.clone(kwargs['vm_name'], sync_run=True,
                resourcepool=self._get_resource_pool(kwargs['resourcepool']))
            return kwargs['vm_name']
        else:
            raise Exception('Could not clone %s' % template)

    def remove_host_from_cluster(self, hostname):
        req = VI.DisconnectHost_TaskRequestMsg()
        mor = (key for key, value in self.api.get_hosts().items() if value == hostname).next()
        sys = VIMor(mor, 'HostSystem')
        _this = req.new__this(sys)
        _this.set_attribute_type(sys.get_attribute_type())
        req.set_element__this(_this)
        task_mor = self.api._proxy.DisconnectHost_Task(req)._returnval
        t = VITask(task_mor, self.api)
        wait_for(lambda: 'success' in t.get_state())
        self._destroy_host(hostname)

    def _destroy_host(self, hostname):
        req = VI.Destroy_TaskRequestMsg()
        mor = (key for key, value in self.api.get_hosts().items() if value == hostname).next()
        sys = VIMor(mor, 'HostSystem')
        _this = req.new__this(sys)
        _this.set_attribute_type(sys.get_attribute_type())
        req.set_element__this(_this)
        task_mor = self.api._proxy.Destroy_Task(req)._returnval
        t = VITask(task_mor, self.api)
        wait_for(lambda: 'success' in t.get_state())