def main():
    """Sets up the module parameters, validates them and perform the change"""
    module = AnsibleModule(
        argument_spec=dict(
            vcenter_hostname=dict(required=True),
            username=dict(required=True),
            password=dict(required=True),
            guest=dict(required=True),
            resource_pool=dict(required=True),
            cluster=dict(required=True),
            sync=dict(required=False, type='bool', default=True)
        ),
        supports_check_mode=True
    )

    server = VIServer()
    server.connect(
        module.params['vcenter_hostname'],
        module.params['username'],
        module.params['password'])
    virtualmachine = server.get_vm_by_name(module.params['guest'])

    old_name = virtualmachine.get_resource_pool_name()
    new_name = module.params['resource_pool']

    # find the clusters ManagedObjectReference
    cluster = None
    clusters = server.get_clusters()
    for mor, name in clusters.iteritems():
        if name == module.params['cluster']:
            cluster = mor
            break

    if cluster is None:
        module.fail_json(msg='Cluster %s not found on server %s' %
            (module.params['cluster'], module.params['vcenter_hostname']))

    # find the new resource pools Managed Object Reference and migrate the VM
    rps = server.get_resource_pools(from_mor=cluster)
    for mor, path in rps.iteritems():
        if re.match('.*%s$' % new_name, path):
            if not re.match('.*%s$' % old_name, path):
                if not module.check_mode:
                    virtualmachine.migrate(
                        resource_pool=mor,
                        host=virtualmachine.get_property('hostname'),
                        sync_run=module.params['sync'])
                module.exit_json(changed=True, changes=module.params)
            module.exit_json(changed=False, changes=module.params)
    module.fail_json(msg='Resource pool %s not found' %
        module.params['resource_pool'])
Ejemplo n.º 2
0
# Setting up vars
datacenters = None
clusters = None
hosts = None
datastores = None
vms = None

try:
    # Getting datacenters
    logger.debug('Getting datastores')
    datacenters = con.get_datacenters().values()

    # Getting clusters
    logger.debug('Getting clusters')
    clusters = con.get_clusters().values()

    # Getting Hosts
    logger.debug('Getting Hosts')
    hosts = con.get_hosts().values()

    # Getting Datastores
    logger.debug('Getting Datastores')
    datastores = con.get_datastores().values()

    # Getting Registered VMs
    logger.debug('Getting VMs')
    vms = con.get_registered_vms()

    # Disconnecting from server
    con.disconnect()
Ejemplo n.º 3
0
for cr in crmors:
    if crmor:
        break
    for p in cr.PropSet:
        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
if resource_pool_path:
    cluster = [k for k, v in s.get_clusters().items() if v == cluster_name][0]
    rpmor = [
        k for k, v in s.get_resource_pools(from_mor=cluster).items()
        if v == resource_pool_path
    ][0]
else:
    rpmor = crprops.resourcePool._obj

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())
	print "Invalid username or password"
	sys.exit(1)

##if:Do we have a host?
if sThisCluster != "":
	##stmt:Yes, connect to vCenter
	server = VIServer()
	server.connect(sThisEsxiHost, sThisUser, sThisPasswd)

	##stmt:Get datacenter object
	oDataCenter = server.get_datacenters()

	##loop:Get each datacenter
	for dc_mor, dc_name in oDataCenter.items():
		##stmt:Get clusters in the datacenter
		oClusters = server.get_clusters(from_mor=dc_mor)

		##loop:Get each cluster
		for c_mor, c_name in oClusters.items():
			##stmt:Get next cluster

			##if:Is this the cluster we are looking for?
			if sThisCluster == c_name:
				##stmt:Yes, get hosts
				oHosts = server.get_hosts(from_mor=c_mor)

				##loop:Get each host from cluster
				for h_mor, h_name in oHosts.items():
					##stmt:Get next host
					print h_name
					bFound = True
Ejemplo n.º 5
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)
Ejemplo n.º 6
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
    if(cur_region != region):
        vcip = None
        if(region == 'TOKYO'):
            vcip = '10.1.1.50'
        else:
            vcip = '10.1.8.50'
    
        logger.debug("Trying to connect %s" % vcip)
        vc.connect(vcip,'sbgcf\\svc_report','VMwar3!!')
        cur_region = region

        try:
            host_d = {}
            vm_d = {}
            for c_mor, c_name in vc.get_clusters().items():
                if(not c_name in clstrname_d): continue
                logger.debug("Fetching cluster '%s'",c_name)
                for h_mor,h_name in vc.get_hosts(from_mor=c_mor).items():
                    logger.debug("Fetching host %s",h_name)
                    host_d[h_name] = c_name
                    for v_mor, v_name in vc._get_managed_objects(MORTypes.VirtualMachine, from_mor=h_mor).items():
                        vm_d[v_name] = h_name
        except:
            raise Exception("Failed to query VM list from vCenter %s" % vcip)

    is_replica = re.match('.+REPLICA',appid)

    if(not vm in vm_d):
        if(is_replica):
            ERROR(ErrorCode.E_MISSING_REPLICA,appid," (%s)" % vm)
Ejemplo n.º 8
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.º 9
0
class ESXi_Server:
    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
Ejemplo n.º 10
0
        log("Connecting to vCenter %s..." % server_name)
        server = VIServer()
        server.connect(server_name, user_name, password)

        # Get a reference to the folder in which VM needs to be created
        folders_list = server._get_managed_objects(MORTypes.Folder)
        for key in folders_list.keys():
            if folders_list[key] == folder_name:
                folder_mor = key
                break
        else:
            raise Exception("Folder not found")

#         folder_filter = {"parent": folder_mor}
        clusters_list = server.get_clusters()
        for cluster_key in clusters_list.keys():
            if clusters_list[cluster_key] == cluster_name:
                resourcepool = server.get_resource_pools(cluster_key).keys()[0]
# WPST
        folder_mor = [
            mor for mor, name in server._get_managed_objects(
                MORTypes.Folder).items() if name == folder_name
        ][0]
        vms = server._get_managed_objects(MORTypes.VirtualMachine,
                                          from_mor=folder_mor).values()
        # delete old VMs
        if is_purge == 'True':
            for vmname in vms:
                if vm_munged_name_prefix not in vmname:
                    targetvm = server.get_vm_by_name(vmname)
Ejemplo n.º 11
0
def main():
    parser = argparse.ArgumentParser(
        description=
        'Roster_builder builds out an YAML roster file by querying vcenter.')
    parser.add_argument("-u",
                        "--username",
                        help="Vcenter username.",
                        default="admin")
    parser.add_argument("-c",
                        "--cluster",
                        help="Specify cluster to grab node data for. Ex: ACDP")
    parser.add_argument("-s",
                        "--site",
                        help="Build a roster for a specific site.",
                        default=0)
    parser.add_argument(
        "-f",
        "--file",
        help="Name of roster file to write to [Default: roster.txt]",
        default="roster.txt")
    parser.add_argument(
        "-F",
        "--format",
        help=
        "Output format. Supported types are YAML,JSON,CSV. [Default: YAML]",
        default="YAML")
    parser.add_argument(
        "-p",
        "--poweredoff",
        help="Include powered off machines in output. [Default: off]",
        action='store_true')

    args = parser.parse_args()
    server = VIServer()
    vmlist = []
    f = open(args.file, 'w')

    if args.site:
        site_dict = vcenter_lookup(args.site)
        print "Using site data: ", site_dict
    else:
        site_dict = vcenters

    print "Enter vcenter password for", args.username
    password = getpass.getpass('Password:'******':\n')
        if args.cluster is None:
            clusters = server.get_clusters().iteritems()
        else:
            clusters = {"key": args.cluster}.iteritems()

        # Grab hosts by cluster
        for key, value in clusters:
            print "Cluster: ", value
            cluster = [
                k for k, v in server.get_clusters().iteritems() if v == value
            ]

            for node in cluster:
                vmlist = server._retrieve_properties_traversal(
                    property_names=props,
                    from_node=node,
                    obj_type=MORTypes.VirtualMachine)

            if vmlist is None:
                continue

            f.write('  ' + value + ':\n')

            for vm in vmlist:
                try:
                    prop_set = vm.PropSet
                except AttributeError:
                    continue

                hostName = ""
                ipAddress = ""
                powerState = ""
                name = ""

                for prop in prop_set:
                    if prop.Name == 'config.guestFullName':
                        guestFullName = prop.Val
                    if prop.Name == 'summary.runtime.powerState':
                        powerState = prop.Val
                    elif prop.Name == 'name':
                        name = prop.Val
                    elif prop.Name == 'guest.toolsVersionStatus':
                        toolsStatus = prop.Val
                    elif prop.Name == 'guest.hostName':
                        hostName = prop.Val
                    elif prop.Name == 'guest.ipAddress':
                        ipAddress = prop.Val

                state, info = guest_tools_map.get(toolsStatus,
                                                  (3, "toolsUnknown"))
                toolsStatus = guest_tools_map.get(toolsStatus, state)

                if hostName == "":
                    hostName = name

                if powerState == 'poweredOff' and args.poweredoff is None:
                    continue
                f.write('   ' + hostName + ':\n')
                f.write('      ipAddress: ' + ipAddress + '\n')
                f.write('      guestOS: ' + guestFullName + '\n')
                f.write('      powerState: ' + powerState + '\n')
                f.write('      toolsStatus: ' + info + '\n')
def main():
  parser = argparse.ArgumentParser(description='Roster_builder builds out an YAML roster file by querying vcenter for the specified regex.')
  parser.add_argument("-r", "--regex", help="Regex search string. Example: \"dfw1-access0[0-9].*\"", default=".*")  
  parser.add_argument("-u", "--username", help="Vcenter username.", default="admin")
  parser.add_argument("-c", "--cluster", help="Specify cluster to grab node data for. Ex: ACDP")
  parser.add_argument("-s", "--site", help="Build a roster for a specific site.", default=0)
  parser.add_argument("-f", "--file", help="Name of roster file to write to [Default: roster.txt]", default="roster.txt")
  args = parser.parse_args()

  server = VIServer()
  properties = ['name', 'summary.runtime.powerState', 'config.guestFullName', 'guest.ipAddress', 'guest.hostName', 'guest.toolsRunningStatus']
  hosts = []
  vmlist = []
  regex = args.regex

  f = open(args.file, 'w')

  if args.site:
    site_dict = vcenter_lookup(args.site)
    print "Using site data: ",site_dict
  else:
    site_dict = vcenters

  print "Enter vcenter password for", args.username
  password = getpass.getpass('Password:'******':\n')
    if args.cluster is None:
    	clusters = server.get_clusters().iteritems()
    else:
        clusters = { "key": args.cluster }.iteritems()

    for key, value in clusters:
      cluster = [k for k,v in server.get_clusters().iteritems() if v==value]
      print "Cluster: ",value

      for node in cluster:
        vmlist = server._retrieve_properties_traversal(
          property_names=properties,
          from_node=node,
          obj_type=MORTypes.VirtualMachine)

      if vmlist is None:
        continue

      f.write('  '+value+':\n')

      for vm in vmlist:
        try:
          prop_set = vm.PropSet
        except AttributeError:
          continue

        for prop in prop_set:
          if prop.Name == 'summary.runtime.powerState':
            powerState = prop.Val
          elif prop.Name == 'guest.hostName':
            hostName = prop.Val
          elif prop.Name == 'config.guestId':
            guestId = prop.Val
          elif prop.Name == 'guest.ipAddress':
            ipAddress = prop.Val
          elif prop.Name == 'name':
            name = prop.Val
          elif prop.Name == 'guest.toolsRunningStatus':
            toolsRunningStatus = prop.Val

        if powerState == 'poweredOff':
          toolsRunningStatus = 'poweredOff'
 
        if re.search(regex,hostName):
          f.write('   '+ hostName + ':\n')
          f.write('      ipAddress: ' + ipAddress + '\n')
          f.write('      powerState: ' + powerState + '\n')
          f.write('      toolsRunningStatus: ' + toolsRunningStatus + '\n')
Ejemplo n.º 13
0
import sys

vCenterserver = "172.17.117.104"
username = "******"  #"administrateur"
password = "******"  #"Pr0l0gue2014";
LOG_FILE = "/var/log/pysphere.log"

template = "Ubuntu12.04-VMware-Tool-64bits"
resource_pool_name = "/Resources/testRessourcePool"
vm_name = "VM2"
''''Get CPU and Memory usage for a specifi Cluster '''

Cluster = "cluster103"
con = VIServer()
con.connect(vCenterserver, username, password, LOG_FILE)
MORefRPhost = [k for k, v in con.get_clusters().items() if v == Cluster][0]
prop = VIProperty(con, MORefRPhost)
print "*" * 50
print "Stats for", Cluster
dir(prop.summary)
t = prop.summary._values
print "  numHosts:", t['numHosts']
print "  totalCpu:", t['totalCpu']
print "  effectiveMemory:", t['effectiveMemory']
print "  totalMemory:", t['totalMemory']
print "  effectiveCpu:", t['effectiveCpu']

#{'numCpuThreads': 8, 'numVmotions': 0, 'numHosts': 1, 'currentBalance': 0, 'dynamicType': None,
#'currentFailoverLevel': -1, 'dynamicProperty': [], 'totalCpu': 19192, 'effectiveMemory': 28908, 'totalMemory': 34312003584, 'targetBalance': 282, 'numCpuCores': 8, 'effectiveCpu': 16844, 'overallStatus': 'green', 'numEffectiveHosts': 1}
con.disconnect()
''''Get CPU and Memory usage for a specifi Host '''
Ejemplo n.º 14
0
class ESXi_Server:
    server_ip = ''
    user_name = ''
    password = ''
    connect_flag = False
    server = None

    # vm_list = []

    # 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', 'POWERED ON', 'POWERED OFF', 'SUSPENDED']:
            LOG.debug(
                "Get VMs error: param can only be set as ALL, POWERED ON,\
                    POWERED OFF, or SUSPENDED.")
            return None
        if not self.connect_flag:
            LOG.info("Get VMs error: Server not connected.")
            return None
        if param == 'ALL':
            return self.server.get_registered_vms(datacenter, cluster,
                                                  resource_pool)
        elif param == 'POWERED ON':
            return self.server.get_registered_vms(datacenter,
                                                  cluster,
                                                  resource_pool,
                                                  status='poweredOn')
        elif param == 'POWERED 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:
            self.server = self.server.disconnect()
            self.connect_flag = False

    # To keep session alive
    def keep_session_alive(self):
        return 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:
            LOG.error("Get hosts error!")
            return None
        return hosts_dic

    def run_vm_by_name(self, name):
        """
        Run vm by name.
        """
        try:
            vm = self.server.get_vm_by_name(name)
            status = vm.get_status()
            if status == 'POWERED ON':
                pass
            elif status == 'POWERED OFF':
                try:
                    vm.power_on()
                except:
                    LOG.error("Run vm error!")
                    pass
            else:
                pass
        except:
            LOG.error("Get vm status error when runing vm!")
            pass

    def stop_vm_by_name(self, name):
        """
        Run vm by name.
        """
        try:
            vm = self.server.get_vm_by_name(name)
            status = vm.get_status()
            if status == 'POWERED OFF':
                pass
            elif status == 'POWERED ON':
                try:
                    vm.power_off()
                except:
                    LOG.error("Stop vm error!")
                    pass
            else:
                pass
        except:
            LOG.error("Get vm status error when stopping vm!")
            pass

    def get_vm_status_by_name(self, name):
        """
        Get vm status by nam
        """
        try:
            vm = self.server.get_vm_by_name(name)
            status = vm.get_status()
            LOG.info("Get VM status is %s" % status)
            return status
        except:
            LOG.info("Get VM status error!")
            return None
Ejemplo n.º 15
0
def main(options):
	global host_vms
	LOGGER.debug("Options: {0}".format(options))
	LOGGER.debug("Args: {0}".format(args))
	
	#check for senseful inputs
	if not options.vcServer or not options.satServer:
		LOGGER.error("You need to specify at least Satellite and vCenter hostnames!")
		exit(1)
	
	#get Satellite and vCenter credentials
	if options.dryrun: LOGGER.info("I'm only doing a simulation, I promise!")
	(satUsername, satPassword) = get_credentials("Satellite", options.satAuthfile)
	(vcUsername, vcPassword) = get_credentials("Virtualization", options.vcAuthfile)
	
	#connect to vCenter
	myVC = VIServer()
	myVC.connect(options.vcServer, vcUsername, vcPassword)
	
	#connect to Satellite
	satellite_url = "http://{0}/rpc/api".format(options.satServer)
	mySat = xmlrpclib.Server(satellite_url, verbose=options.debug)
	key = mySat.auth.login(satUsername, satPassword)
	check_if_api_is_supported(mySat)
	
	#print information about host
	LOGGER.info("Connected to " + options.vcServer + " (" + myVC.get_server_type() + "), version " + myVC.get_api_version() + ".")
	
	#get list of all ESXi hosts by datacenter
	LOGGER.info("Searching for ESXi hosts by datacenter...")
	esxiHosts = myVC.get_hosts()
	datacenters = myVC.get_datacenters()
	for dc in datacenters:
		tempHosts = myVC.get_hosts(from_mor=dc).values()
		hosts_by_dc[datacenters.get(dc)] = (tempHosts)
	LOGGER.debug("Hosts by DC: " + str(hosts_by_dc))
	
	#get list of all ESXi hosts by cluster
	LOGGER.info("Searching for ESXi hosts by cluster...")
	clusters = myVC.get_clusters()
	for cluster in clusters:
		tempHosts = myVC.get_hosts(from_mor=cluster).values()
		hosts_by_cluster[clusters.get(cluster)] = (tempHosts)
	LOGGER.debug("Hosts by cluster: " + str(hosts_by_cluster))
	
	#get list of all VMs by ESXi host
	for dc in datacenters:
		for host in hosts_by_dc[datacenters.get(dc)]:
			LOGGER.debug("Found ESXi host '" + host + "'")
			host_vms[host]=[]
	LOGGER.debug("Added hosts to dict: " + str(host_vms))
	
	#get list of all Linux VMs managed by Satellite
	satlist = mySat.system.listSystems(key)
	target_vms=[]
	LOGGER.info("Digging through list of systems managed by Satellite...")
	for system in satlist:
		LOGGER.debug("Found system '" + system["name"] + "'")
		#get custom keys
		thisKeys = mySat.system.getCustomValues(key, system["id"])
		#add virt_vmname if given
		if "SYSTEM_VIRT_VMNAME" in thisKeys and thisKeys["SYSTEM_VIRT_VMNAME"] != "":
			target_vms.append(thisKeys["SYSTEM_VIRT_VMNAME"])
		else: target_vms.append(system)
		LOGGER.debug("VM names: " + str(target_vms))
	
	#get list of all VMs and assign to host dicts
	LOGGER.info("Getting list of all VMs and assign them to host arrays - grab some coffee.")
	vmlist = myVC.get_registered_vms()
	counter=0
	hit=0
	for vm in vmlist:
		#get VM and its properties
		thisVM = myVC.get_vm_by_path(vm)
		#only add if in target_vms
		if thisVM.properties.name in target_vms:
			LOGGER.debug("Found VM managed by Satellite: '" + thisVM.properties.name + "'")
			host_vms[thisVM.properties.runtime.host.name].append(thisVM.properties.name)
		else: LOGGER.debug("'" + thisVM.properties.name + "' dropped as it is not managed by Satellite")
		
		LOGGER.debug("Current array for host '" + thisVM.properties.runtime.host.name + "': " + str(host_vms[thisVM.properties.runtime.host.name]))
		#show progress
		if hit == 9:
			LOGGER.info("Checked " + str(counter+1) + " of " + str(len(vmlist)) + " VMs so far...")
			hit=0
		else: hit=(hit+1)
		counter=(counter+1)
	LOGGER.debug("Added VMs to host dicts: " + str(host_vms))
	
	#get list of all Linux VMs managed by Satellite
	satlist = mySat.system.listSystems(key)
	LOGGER.info("Updating relevant system custom info keys...")
	for system in satlist:
		LOGGER.debug("Found system '" + system["name"] + "'")
		#get custom keys
		thisKeys = mySat.system.getCustomValues(key, system["id"])
		#update key if exists
		if "SYSTEM_VIRT_HOST" in thisKeys and thisKeys["SYSTEM_VIRT_HOST"] != "":
			#get ESXi host running VM
			if "SYSTEM_VIRT_VMNAME" in thisKeys and thisKeys["SYSTEM_VIRT_VMNAME"] != "":
				this_ESXi = get_ESXi_host_by_vm(thisKeys["SYSTEM_VIRT_VMNAME"])
			else: this_ESXi = get_ESXi_host_by_vm(system["name"])
			#get cluster if applicable
			this_cluster = get_cluster_by_ESXi_host(this_ESXi)
			#update custom key
			if this_cluster != "":
				#cluster
				this_value = "vpx://" + options.vcServer + "/" + get_datacenter_by_ESXi_host(this_ESXi) + "/" + this_cluster + "/" + this_ESXi
			else:
				#no cluster
				this_value = "vpx://" + options.vcServer + "/" + get_datacenter_by_ESXi_host(this_ESXi) + "/" + this_ESXi
			if options.vcVerify == False: this_value = this_value + "?no_verify=1"
			if options.dryrun:
				if this_ESXi != "": LOGGER.info("I'd like to set SYSTEM_VIRT_HOST='" + this_value + "' for system '" + system["name"] + "' (ID " + str(system["id"]) + ")")
				else: LOGGER.error("No valid virt host entry for system '" + system["name"] + "' (ID " + str(system["id"]) + ") found!")
			else:
				#update customkey if not null
				if this_ESXi != "":
					if mySat.system.setCustomValues(key, system["id"], {"SYSTEM_VIRT_HOST": this_value}):
						LOGGER.info("Updated virtual host entry for system '" + system["name"] + "' (ID " + str(system["id"]) + ").")
				else: LOGGER.error("No valid virt host entry for system '" + system["name"] + "' (ID " + str(system["id"]) + ") found!")
Ejemplo n.º 16
0
pip install pysphere

"""

from pysphere import VIServer

server = VIServer()

server.connect("serverip", "adminuser", "pass")

#Get server characteristics
print server.get_server_type()

print server.get_api_version()

print server.get_clusters()

print server._get_resource_pools

#Get all the hosts
print server.get_hosts()

#Get VM`s in Prod resource pool which are in poweredon state

vmachines = server.get_registered_vms()
vmachines = server.get_registered_vms(resource_pool='Prod', status='poweredOn')

#Get virtual machine status
vm1 = server.get_vm_by_name('rhel5.3_prod')
print vm1.get_status()
Ejemplo n.º 17
0
pip install pysphere

"""

from pysphere import VIServer
server = VIServer()

server.connect("serverip","adminuser","pass")

#Get server characteristics
print server.get_server_type()

print server.get_api_version()

print server.get_clusters()

print server._get_resource_pools

#Get all the hosts
print server.get_hosts()

#Get VM`s in Prod resource pool which are in poweredon state

vmachines = server.get_registered_vms()
vmachines = server.get_registered_vms(resource_pool='Prod', status='poweredOn')

#Get virtual machine status
vm1 = server.get_vm_by_name('rhel5.3_prod')
print vm1.get_status()
# Setting up vars
datacenters = None
clusters = None
hosts = None
datastores = None
vms = None

try:
    # Getting datacenters
    logger.debug('Getting datastores')
    datacenters = con.get_datacenters().values()

    # Getting clusters
    logger.debug('Getting clusters')
    clusters = con.get_clusters().values()

    # Getting Hosts
    logger.debug('Getting Hosts')
    hosts = con.get_hosts().values()

    # Getting Datastores 
    logger.debug('Getting Datastores')
    datastores = con.get_datastores().values()

    # Getting Registered VMs
    logger.debug('Getting VMs')
    vms = con.get_registered_vms()
    
    # Disconnecting from server
    con.disconnect()
Ejemplo n.º 19
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())
Ejemplo n.º 20
0
class basicOps:

    server=None

    def connect(self):
        configuration=Config()
        server = configuration._config_value("general", "server")
        if server is None:
            raise ValueError("server must be supplied on command line"+"or in configuration file.")
        username = configuration._config_value("general", "username")
        if username is None:
            raise ValueError("username must be supplied on command line"
                         " or in configuration file.")
        password = configuration._config_value("general", "password")
        if password is None:
            raise ValueError("password must be supplied on command line"
                         " or in configuration file.")
        self.server=VIServer()
        self.server.connect(server,username,password)

    def startVm(self,vmname):
        vm=self.server.get_vm_by_name(vmname)
        status=vm.get_status()
        if status=="POWERED OFF":
            task=vm.power_on(run_sync=False)
            return task

    def stopVm(self, vmname):
        vm=self.server.get_vm_by_name(vmname)
        status=vm.get_status()
        if status=="POWERED ON":
            task=vm.power_off(run_sync=False)
            return task


    def stopGuest(self,vmname):
        vm=self.server.get_vm_by_name(vmname)
        task=vm.shutdown_guest(run_sync=False)
        return task

    def rebootGuest(self,vmname):
        vm=self.server.get_vm_by_name(vmname)
        task=vm.reboot_guest(run_sync=False)
        return task

    def getDataCenters(self):
        return self.server.get_datacenters()

    def clone(self,templateName,cloneName="Template Clone"):
        vm=self.server.get_vm_by_name(templateName)
        resourcePool=self.getResourcePool()
        print resourcePool
        task=vm.clone(cloneName,resourcepool=resourcePool,sync_run=False)
        try:
            status=task.get_state()
            print(status)
            print "Creating machine from template:Job Status:" + status
            if  status!="error":
              while (status!="success" or status !="error"):
                  status=task.get_state()
                  if  status=="success":
                   break;
            print "Creating machine from template: Job Status:" + status
            #vm_new=self.server.get_vm_by_name(cloneName)
            #return vm_new
        except:
            print("Error Occured:")


    def getResourcePool(self):

        configuration=Config()
        datacenter = configuration._config_value("vmware", "datacenter")
        if datacenter is None:
            raise ValueError("server must be supplied"+"in configuration file.")
        cluster = configuration._config_value("vmware", "cluster")
        if cluster is None:
            raise ValueError("cluster name must be supplied in configuration file.")
        resourcePool = configuration._config_value("vmware", "resourcePool")
        if resourcePool is None:
            raise ValueError("Resource Pool name must be supplied in configuration file")
        clusters=self.server.get_clusters()
            #print clusters
        keycluster=self.find_key(clusters,cluster)
           # print(keycluster)
        resource_pools=self.server.get_resource_pools(keycluster)
       # print(resource_pools)
        resourcePool=self.find_key(resource_pools,resourcePool,True)
       # print (resourcePool)
        return resourcePool


 #               resource_pools=self.server.get_resource_pools()
    def find_key(self,dic, val, partial=False):
      retval=None
      if partial==False:
       retval=[k for k, v in dic.iteritems() if v == val][0]
      else:
        retval =[k for k, v in dic.iteritems() if (v.find(val)>0)][0]
      return retval

    def find_value(self,dic, key):
     return dic[key]
Ejemplo n.º 21
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.º 22
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.º 23
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)
Ejemplo n.º 24
0
try:
  options.vm_path
except NameError:
  options.vm_path = raw_input("Enter the Template/VM to convert: ")

# Make the vcenter connection
server = VIServer()
server.connect(options.vcenter, options.username, options.password)

# Set the host, cluster and resource pool to "deploy" it into
# We get teh "mor" which is a number to identify with vCenter
hosts = server.get_hosts()
host = [k for k,v in hosts.items() if v=="esxhost.local"][0]
vm = server.get_vm_by_name(options.vm_path)
cluster_name = "DevTest_Cluster"
resource_pool = "/Resources"
cluster = [k for k,v in server.get_clusters().items() if v==cluster_name][0]
rpmor = [k for k,v in server.get_resource_pools(from_mor=cluster).items() if v==resource_pool][0]

# This is the request message we send off to make the change, setting the 
# vm, host, and resource pool.
request = VI.MarkAsVirtualMachineRequestMsg()
_this = request.new__this(vm._mor)
_this.set_attribute_type(vm._mor.get_attribute_type())
request.set_element__this(_this)
request.set_element_pool(rpmor)
request.set_element_host(host)
server._proxy.MarkAsVirtualMachine(request)

server.disconnect()