def main(argv=None): if argv is None: argv = sys.argv server = VIServer() server.connect(sys.argv[1], sys.argv[2], sys.argv[3]) print "{" print "\t\"data\":[\n" first = 1 for ds_mor, name in server.get_datastores().items(): props = VIProperty(server, ds_mor) if not first: sys.stdout.write(",") first = 0 pfree = float(props.summary.freeSpace) / float(props.summary.capacity) * 100 print "\n\t{" print "\t\t\"{#DSNAME}\":\"%s\"," % name print "\t\t\"{#DSACCESS}\":\"%d\"," % props.summary.accessible print "\t\t\"{#DSCAP}\":\"%s\"," % props.summary.capacity print "\t\t\"{#DSFREE}\":\"%s\"," % props.summary.freeSpace print "\t\t\"{#DSPFREE}\":\"%s\"" % pfree sys.stdout.write("\t}") print "\n\t]" print "}" server.disconnect()
def vmwareplugin_datastores(request): from pysphere import VIServer data = { 'error': False, } if request.POST.get('oid'): vmware = models.VMWarePlugin.objects.get(id=request.POST.get('oid')) else: vmware = None try: if request.POST.get('password'): password = request.POST.get('password') elif not request.POST.get('password') and vmware: password = vmware.get_password() else: password = '' server = VIServer() server.connect( request.POST.get('hostname'), request.POST.get('username'), password, sock_timeout=7, ) data['value'] = server.get_datastores().values() server.disconnect() except Exception, e: data['error'] = True data['errmsg'] = unicode(e).encode('utf8')
class CheckVCenter(): def __init__(self): self.server = VIServer() self.STAT_OK=0 self.STAT_WARNING=1 self.STAT_CRITICAL=2 self.vc = sys.argv[1] self.user = sys.argv[2] self.password = sys.argv[3] @staticmethod def PrintDict(i,status): for k,v in i.items(): print "VMFS %s lun:%s -----*----*---- usage:%d%%" %(status,k,v) def Check(self): self.server.connect(self.vc,self.user,self.password) Value = self.server.get_datastores() c = {} w = {} n = {} for k,v in Value.items(): props = self.server._retrieve_properties_traversal(property_names=['name','summary.capacity', 'summary.freeSpace'], from_node=k,obj_type='Datastore') for p_set in props: for p1 in p_set.PropSet: if p1.Name == "summary.capacity": DatastoreCapacity = (p1.Val/1073741824) elif p1.Name == "summary.freeSpace": DatastoreFreespace = (p1.Val/1073741824) Percent = (((DatastoreCapacity - DatastoreFreespace) * 100)/DatastoreCapacity) if Percent > 90 and 'ISO' not in v: c[v] = Percent elif Percent > 85 < 90 and 'ISO' not in v: w[v] = Percent elif Percent < 85 and 'ISO' not in v: n[v] = Percent if dict(c): CheckVCenter.PrintDict(c,'CRITICAL') sys.exit(self.STAT_CRITICAL) elif dict(w): CheckVCenter.PrintDict(w,'WARNING') sys.exit(self.STAT_WARNING) else: print("All Lun is OK") sys.exit(self.STAT_OK)
def get_datastore_info(host_ip,host_name,host_password): stats_data_list = [] s = VIServer() s.connect(host_ip, host_name, host_password) print 'VC connect successful...' for ds, dsname in s.get_datastores().items(): DatastoreCapacity = 0 DatastoreFreespace = 0 DatastoreUsagePercent = 0 props = s._retrieve_properties_traversal(property_names=['name', 'summary.capacity', 'summary.freeSpace'], from_node=ds, obj_type="Datastore") # print props for prop_set in props: for prop in prop_set.PropSet: if prop.Name == "summary.capacity": DatastoreCapacity = round((prop.Val / 1073741824),2) elif prop.Name == "summary.freeSpace": DatastoreFreespace = round((prop.Val / 1073741824),2) UsedSpace = round((DatastoreCapacity - DatastoreFreespace),2) DatastoreUsagePercent = round((((DatastoreCapacity - DatastoreFreespace) * 100) / DatastoreCapacity),2) metricnameZoneDatastoreCapacity = dsname.lower() + 'Capacity' metricnameZoneDatastoreFreespace = dsname.lower() + 'FreeSpace' metricnameZoneDatastoreUsagePercent = dsname.lower() + 'UsagePercent' volumes_dict = {'volumes': dsname.lower(), 'FreeSpace': DatastoreFreespace, 'UsedSpace': UsedSpace, 'capacity': DatastoreCapacity, 'usagePercent': DatastoreUsagePercent} #pprint.pprint(volumes_dict) #DebugInfo.objects.create(text_info=volumes_dict) stats_data_list.append(volumes_dict) #print 'mVC disconnect successful...' s.disconnect() return stats_data_list
def poll_vcenter(self, vcenter): """ Open a connection to the specified vCenter server and begin gathering information about its datastores, datacenters, clusters, and hosts. :param str vcenter: The hostname or IP of a vCenter server. :returns: A dictionary containing information about the current state of objects managed by the specified vCenter. """ self.log.debug('polling %s@%s' % (self.username, vcenter)) server = VIServer() try: server.connect(vcenter, self.username, self.password) except: self.log.exception('Failed to connect to %s' % (vcenter,)) return {} stats = { 'datastore': {}, 'datacenter': {}, } for obj, name in server.get_datastores().items(): ds_stats = self.poll_datastore(server, obj, name) stats['datastore'][name] = ds_stats datacenters = server.get_datacenters() for obj, name in datacenters.items(): dc_stats = self.poll_datacenter(server, obj, name) stats['datacenter'][name] = dc_stats return stats
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())
logger.debug('Second set of properties: %s' % properties2) # Dictionaries and additional variables configuration vms_info = {} hosts_dict = None datastores_dict = None dvpgs = {} paths = {} props = None # hosts, datastores, dvpgs, paths and vms try: hosts_dict = server.get_hosts().items() logger.debug('Host dictionary generated with size %d' % (len(hosts_dict))) datastores_dict = server.get_datastores().items() logger.debug('Datastores dictionary generated with size %d' % (len(datastores_dict))) datacenters = server.get_datacenters().items() logger.debug('Datacenters dictionary generated with size %d' % (len(datacenters))) dvpgs = get_dvp_dict(datacenters, dcname, server) logger.debug( 'Distributed Virtual Portgroup dictionary generated with size %d' % (len(dvpgs))) paths = get_paths_dict(server, properties2) logger.debug('VM Paths dictionary generated with size %d' % (len(paths))) logger.info(
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
#vm = s.get_vm_by_path(VM_PATH) destination_folder = "/Resources/vm-test-name" rp_path = "/Resources" for k, v in s.get_resource_pools().items(): if v == destination_folder: pass print("k and v = %s %s" % (k, v)) print("Couldn't find folder '%s'" % (folder_name)) #look for the resource pool whose path is rp_path for ds, ds_name in s.get_datastores().items(): print ds_name if ds_name == DATASTORE: print "Found Datacenter: %s" % DATASTORE pprint(ds) #VMs should be created by a folder, in ESX always uses the vm folder vmfmor = [ k for k, v in s._get_managed_objects(MORTypes.Folder).items() if v == "vm" ][0] print "vmfmor = %s" % vmfmor #look for the resource pool whose path is rp_path rpmor = [k for k, v in s.get_resource_pools().items() if v == rp_path][0] print "rpmor = %s" % rpmor
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)
logger.debug('Second set of properties: %s' %properties2) # Dictionaries and additional variables configuration vms_info = {} hosts_dict = None datastores_dict = None dvpgs = {} paths = {} props = None # hosts, datastores, dvpgs, paths and vms try: hosts_dict = server.get_hosts().items() logger.debug('Host dictionary generated with size %d' % (len(hosts_dict))) datastores_dict = server.get_datastores().items() logger.debug('Datastores dictionary generated with size %d' % (len(datastores_dict))) datacenters = server.get_datacenters().items() logger.debug('Datacenters dictionary generated with size %d' % (len(datacenters))) dvpgs = get_dvp_dict(datacenters, dcname, server) logger.debug('Distributed Virtual Portgroup dictionary generated with size %d' % (len(dvpgs))) paths = get_paths_dict(server, properties2) logger.debug('VM Paths dictionary generated with size %d' % (len(paths))) logger.info('Pre-required dictionaries were successfully gotten: Hosts (%s), Datastores (%s), Datacenters(%s), DVPG(%s) and VM Paths(%s)' %(len(hosts_dict), len(datastores_dict), len(datacenters), len(dvpgs), len(paths))) logger.info('Building main Virtual Machine properties dictionary. This might take a few minutes.') vms_info = get_vms_dict(server, properties, paths, hosts_dict, datastores_dict, dvpgs) logger.debug('VM main dictionary generated with size %d' %(len(vms_info)))
print("done") except: print("connect to {} failed".format(args.host)) exit(1) if args.file: vmxq = read_csv(args.file) while 1: if vmxq.qsize() > 0: d = vmxq.get() run_script() else: break elif args.show == 'datacenters': for k, v in vc.get_datacenters().items(): print(k, v) elif args.show == 'datastores': for k, v in vc.get_datastores().items(): print(k, v) elif args.show == 'vmxlist': for item in vc.get_registered_vms(): print(item) else: run_script() vc.disconnect()
from pysphere import VIServer, VIProperty server = VIServer() HOST = "HostNameOrIPAddress" USER = "******" PASSWORD = "******" server.connect(HOST, USER, PASSWORD) for ds_mor, name in server.get_datastores().items(): props = VIProperty(server, ds_mor) print "DATASTORE:", name print " Type:", props.summary.type print " Capacity:", props.summary.capacity print " Free space:", props.summary.freeSpace if hasattr(props.summary, "uncommitted"): print " Uncommited:", props.summary.uncommitted server.disconnect()
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
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
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() except VIException as ins: logger.error(ins) logger.debug('An error ocurred getting vSphere data.') con.disconnect() sys.exit() # printing main report print_main(datacenters, clusters, hosts, datastores, vms)
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
"summary.quickStats.overallCpuDemand", "summary.quickStats.privateMemory", "summary.quickStats.sharedMemory", "summary.quickStats.staticCpuEntitlement", "summary.quickStats.staticMemoryEntitlement", "summary.quickStats.swappedMemory" ] print "*" * 50 print "Stats for VM", vm_name results = s._retrieve_properties_traversal(property_names=properties, obj_type=MORTypes.VirtualMachine) for item in results: if (item.Obj == vm._mor): for p in item.PropSet: print p.Name, "=>", p.Val ''' GET datastore capacity ''' datastore = 'Disque2Tera' server = VIServer() server.connect(vCenterserver, username, password, LOG_FILE) MORefdatastore = [ k for k, v in server.get_datastores().items() if v == datastore ][0] props = VIProperty(server, MORefdatastore) print "DATASTORE:", datastore print " Type:", props.summary.type print " Capacity:", props.summary.capacity print " Free space:", props.summary.freeSpace server.disconnect()
OVF_FILE = "ovf.ovf" #you can get the host names running s.get_hosts() HOST = "10.16.120.54" DATASTORE = "datastore1" NETWORK_MAPPING = {"bridged": "VM Network"} VAPP_NAME = "import1" s = VIServer() s.connect("10.16.120.178", "administrator", "R3dhat!") try: host = [k for k, v in s.get_hosts().items() if v == HOST][0] resource_pool = [ k for k, v in s.get_resource_pools().items() if v == RESOURCE_POOL ][0] datastore = [ k for k, v in s.get_datastores().items() if v == DATASTORE ][0] ovf = get_descriptor(OVF_FILE) descriptor_info = parse_descriptor(ovf) if hasattr(descriptor_info, "Warning"): print "Warning:", descriptor_info.Warning[0].LocalizedMessage if hasattr(descriptor_info, "Error"): print "Error:", descriptor_info.Error[0].LocalizedMessage exit() support_info = validate_host(host, ovf) import_spec = create_import_spec( resource_pool, datastore, ovf, VAPP_NAME,
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)
RESOURCE_POOL = "/Resources" OVF_FILE = "ovf.ovf" #you can get the host names running s.get_hosts() HOST = "10.16.120.54" DATASTORE = "datastore1" NETWORK_MAPPING = {"bridged":"VM Network"} VAPP_NAME = "import1" s = VIServer() s.connect("10.16.120.178", "administrator", "R3dhat!") try: LOGGER.debug('Hosts: %s.', s.get_hosts()) host = [k for k,v in s.get_hosts().items() if v==HOST][0] resource_pool = [k for k,v in s.get_resource_pools().items() if v == RESOURCE_POOL][0] LOGGER.debug('Datastores: %s', s.get_datastores()) datastore = [k for k,v in s.get_datastores().items() if v==DATASTORE][0] ovf = get_descriptor(OVF_FILE) descriptor_info = parse_descriptor(ovf) if hasattr(descriptor_info, "Warning"): LOGGER.warning(str(descriptor_info.Warning[0].LocalizedMessage)) if hasattr(descriptor_info, "Error"): LOGGER.error(str(descriptor_info.Error[0].LocalizedMessage)) exit() support_info = validate_host(host, ovf) import_spec = create_import_spec(resource_pool, datastore, ovf, VAPP_NAME, host=host,
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
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
options.password except NameError: options.password = getpass() try: options.esxhost except NameError: options.esxhost = raw_input("Enter the ESX host to remove the share from: ") datastore_name = "datastorename" server = VIServer() server.connect(options.vcenter,options.username,options.password) host_mor = [k for k,v in server.get_hosts().items() if v==options.esxhost][0] ds_mor = [k for k,v in server.get_datastores().items() if v==datastore_name][0] host = VIProperty(server, host_mor) ds_system = host.configManager.datastoreSystem._obj request = VI.RemoveDatastoreRequestMsg() _this = request.new__this(ds_system) _this.set_attribute_type(ds_system.get_attribute_type()) request.set_element__this(_this) request.Datastore = ds_mor server._proxy.RemoveDatastore(request) server.disconnect()
from pprint import pprint from pysphere import VIServer, VIProperty HOST = "my esxi server" USER = "******" PASSWORD = "******" DATASTORE = "datastore1" #WHERE THE DISK WILL BE CREATED AT VM_NAME = "vm-test-name" folder = "vm-test-name" server = VIServer() server.connect(HOST, USER, PASSWORD) for ds_mor, name in server.get_datastores().items(): props = VIProperty(server, ds_mor) if hasattr(props.summary, "uncommitted"): stat = {'name': str(name), 'type': str(props.summary.type), 'capacity': str(props.summary.capacity), 'free_space': str(props.summary.freeSpace), 'uncommited': str(props.summary.uncommitted)} else: stat = {'name': str(name), 'type': str(props.summary.type), 'capacity': str(props.summary.capacity), 'free_space': str(props.summary.freeSpace), 'uncommited': "N/A"} pprint(stat) server.disconnect()
if len(sys.argv) != 5: print >> sys.stderr, 'ERROR: wrong args' usage() sys.exit(2) vcenter = sys.argv[1] user = sys.argv[2] password = sys.argv[3] mode = sys.argv[4] server = VIServer() server.connect(vcenter, user, password) try: datastores = server.get_datastores() if mode == 'discovery': output = [] for mof, name in datastores.items(): output.append('{"{#ID}":"%s", "{#NAME}":"%s"}' % (mof, name)) print '{ "data":[' for i, v in enumerate(output): if i < len(output) - 1: print v + ',' else: print v print ' ]}' if mode == 'data': #<hostname> <key> <timestamp> <value>
try: sock.connect( (CARBON_SERVER,CARBON_PORT) ) except: print "Couldn't connect to %(server)s on port %(port)d, is carbon-agent.py running?" % { 'server':CARBON_SERVER, 'port':CARBON_PORT } sys.exit(1) try: server.connect(HOST, USER, PASSWORD) except: print "Unable to connect to vsphere server" sys.exit(1) pm = server.get_performance_manager() while True: lines = [] for dc_mor, dc_name in server.get_datacenters().items(): now = int(time.time()) datastores = server.get_datastores(dc_mor) for ds_mor, ds_name in datastores.items(): gphDSName = ds_name.replace('.', '_') gphDSName = gphDSName.replace(' ', '_') props = VIProperty(server, ds_mor) lines.append(prefix + dc_name + ".datastores." + props.summary.type + "." + gphDSName + ".capacity " + str(props.summary.capacity) + " " + str(now)) lines.append(prefix + dc_name + ".datastores." + props.summary.type + "." + gphDSName + ".freespace " + str(props.summary.freeSpace) + " " +str(now)) if hasattr(props.summary, "uncommitted"): lines.append(prefix + dc_name + ".datastores." + props.summary.type + "." + gphDSName + ".uncommitted " + str(props.summary.uncommitted) + " " + str(now)) message = '\n'.join(lines) + '\n' sock.sendall(message) print message time.sleep(delay) server.disconnect()
#you can get the resource pools running s.get_resource_pools() RESOURCE_POOL = "/Resources" OVF_FILE = "ovf.ovf" #you can get the host names running s.get_hosts() HOST = "10.16.120.54" DATASTORE = "datastore1" NETWORK_MAPPING = {"bridged":"VM Network"} VAPP_NAME = "import1" s = VIServer() s.connect("10.16.120.178", "administrator", "R3dhat!") try: host = [k for k,v in s.get_hosts().items() if v==HOST][0] resource_pool = [k for k,v in s.get_resource_pools().items() if v == RESOURCE_POOL][0] datastore = [k for k,v in s.get_datastores().items() if v==DATASTORE][0] ovf = get_descriptor(OVF_FILE) descriptor_info = parse_descriptor(ovf) if hasattr(descriptor_info, "Warning"): print "Warning:", descriptor_info.Warning[0].LocalizedMessage if hasattr(descriptor_info, "Error"): print "Error:", descriptor_info.Error[0].LocalizedMessage exit() support_info = validate_host(host, ovf) import_spec = create_import_spec(resource_pool, datastore, ovf, VAPP_NAME, host=host, network_mapping=NETWORK_MAPPING,