def main(argv=None): if argv is None: argv=sys.argv server = VIServer() try: server.connect(sys.argv[1], sys.argv[2], sys.argv[3]) hosts = server.get_hosts() for h_mor, h_name in hosts.items(): props = VIProperty(server, h_mor) try: f = open("/tmp/esxi_hosts_" + sys.argv[1] + ".txt", "w") try: f.write("memorySize=" + str(props.hardware.memorySize) + "\n") f.write("overallCpuUsage=" + str(props.summary.quickStats.overallCpuUsage) + "\n") f.write("overallMemoryUsage=" + str(props.summary.quickStats.overallMemoryUsage) + "\n") f.write("uptime=" + str(props.summary.quickStats.uptime) + "\n") # $CPUTotalMhz = $_.Summary.hardware.CPUMhz * $_.Summary.Hardware.NumCpuCores # $row."CpuUsage%" = [math]::round( ($row.CpuUsageMhz / $CPUTotalMhz), 2) * 100 f.write("cpuMhz=" + str(props.summary.hardware.cpuMhz) + "\n") f.write("numCpuCores=" + str(props.summary.hardware.numCpuCores) + "\n") finally: f.close() except IOError: print "0" sys.exit(0)
def main(): DisableSSL() server = VIServer() server.connect(vCenterIP,username,password) hostslist = server.get_hosts().values() # print hostslist f = open("hosts.txt","w") sep = "\n" f.write(sep.join(hostslist)) f.close() #Disconnecting from the server server.disconnect()
def main(): DisableSSL() server = VIServer() server.connect(vCenterIP, username, password) hostslist = server.get_hosts().values() # print hostslist f = open("hosts.txt", "w") sep = "\n" f.write(sep.join(hostslist)) f.close() #Disconnecting from the server server.disconnect()
def vi_retrieve_host_objects(host,properties): s = VIServer() s.connect(vi_configuration["VI_HOST"], vi_configuration["VI_USER"], vi_configuration["VI_PASS"]) # If we can't find this host in the get_hosts() output then it doesn't exist # on this vCenter. We catch this with an indexError and return false to be # detected upstream. Can we do this quicker? Takes ~2s to retrieve the hosts # on a loaded 4.1 vCenter. try: from_host = [k for k,v in s.get_hosts().items() if v == host][0] result = s._retrieve_properties_traversal(property_names=properties,from_node=from_host,obj_type=MORTypes.HostSystem)[0] except IndexError: result = False s.disconnect() return result
def vm_migrate(): """Migrate the VMs based on the list given""" user, passwd, vcenter = get_user_info() host, servers, servercount = get_serverlist() s = VIServer() s.connect(vcenter, user, passwd) getserver_type_api() esxhost_input = raw_input('Enter target ESX Host: ') esxhost = s.get_hosts().items() for k,v in esxhost: if v == esxhost_input: for host in servers: host = host.strip() vm = s.get_vm_by_name(host) vm.migrate(host=k) time.sleep(10) s.disconnect()
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
go_on = True if __name__ == "__main__": #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()
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())
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
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() #Also you can ask the following: print vm1.is_powering_off() print vm1.is_powered_off() print vm1.is_powering_on() print vm1.is_powered_on()
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()
##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 ##if:Did we find any hosts? if bFound == True: ##stmt:Yes, exit script server.disconnect() sys.exit(0) else: ##else:Didn't find any hosts ##stmt:Exit script
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() #Also you can ask the following: print vm1.is_powering_off() print vm1.is_powered_off() print vm1.is_powering_on() print vm1.is_powered_on()
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
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)
if not debug: vm1.power_off() log.warn("VM: %s Forcing Off", vm) log.info("Shutting Down Remaining VMs") vmlist = server.get_registered_vms(status='poweredOn') for vm in vmlist: vm1 = server.get_vm_by_path(vm) if (VMToolsRunning(vm1)): if not debug: vm1.shutdown_guest() log.info("VM: %s Guest Shutdown", vm) else: if not debug: vm1.power_off() log.info("VM: %s Powering Off", vm) if powerOffHost: log.info("Triggering host shutdown") # Issue shutdown command for hosts for host in server.get_hosts(): log.info("Shutting Down Host: %s", host) host = host_mor(host) request = VI.ShutdownHost_TaskRequestMsg() _this = request.new__this(host) _this.set_attribute_type(host.get_attribute_type()) request.set_element__this(_this) request.set_element_force(True) if not debug: task = server._proxy.ShutdownHost_Task(request)._returnval
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!")
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 ''' Host = "172.17.117.103" con = VIServer() con.connect(vCenterserver, username, password, LOG_FILE) MORefRPhost = [k for k, v in con.get_hosts().items() if v == Host][0] prop = VIProperty(con, MORefRPhost) print "*" * 50 print "Stats for host", Host print " overall processor usage:", prop.summary.quickStats.overallCpuUsage print " overall memory usage:", prop.summary.quickStats.overallMemoryUsage print " distributedCpuFairness: ", prop.summary.quickStats.distributedCpuFairness print " distributedMemoryFairness: ", prop.summary.quickStats.distributedMemoryFairness con.disconnect() '''''' '''''' '''''' '''''' '''''' '''''' '''''' '''''' '''''' '''''' '''''' ''' Get All properties for a ressource pool : resource_pool_name ''' '''''' '''''' '''''' '''''' '''''' '''''' '''''' '''''' '''''' '''''' '''''' s = VIServer() s.connect(vCenterserver, username, password, LOG_FILE) MORefRP = [
logger.debug('First set of properties: %s' %properties) properties2 = create_me_props() 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)))
go_on = True if __name__ == "__main__": logging.basicConfig(level=logging.DEBUG) #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: 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)
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 #ESXs have just one host, so use that one hostmor = s.get_hosts().keys()[0] print "hostmor = %s" % hostmor create_folder_request = VI.CreateFolderRequestMsg() config = VI.folder #config = create_folder_request.new_config() create_folder_request.set_element_config(config) files = config.new_files() files.set_element_vmPathName("[%s] %s" % (DATASTORE, folder_name)) config.set_element_files(files) #CREATE THE VM taskmor = s._proxy.CreateVM_Task(create_folder_request)._returnval task = VITask(taskmor, s) task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR]) if task.get_state() == task.STATE_ERROR:
from pysphere import VIServer, VIProperty # vCenter IPaddress ip = "172.27.189.101" url = "https://%s/sdk" % ip username = "******" password = "******" server = VIServer() server.connect(url, username, password) for ds_mor, hostname in server.get_hosts().items(): print print "***", ds_mor, hostname props = VIProperty(server, ds_mor) for item in props.datastore: print item.info.name server.disconnect()
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() except VIException as ins: logger.error(ins) logger.debug('An error ocurred getting vSphere data.') con.disconnect()
def create_vm(): opts = options() # CONNECTION PARAMTERS server = opts.esx_host user = opts.user password = opts.passwd # REQUIRED PARAMETERS vmname = opts.name # datacentername = "ha-datacenter" datacentername = opts.datacenter hostname = opts.hostname annotation = "My Product Product Virtual Machine" memorysize = opts.ram cpucount = opts.cpus # cd_iso_location = # "iso/My_Product_2013_02_26_05_15_00.iso" # # located in the ESX datastore cd_iso_location = opts.iso guestosid = "centos64Guest" # find your os in # http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.vm.GuestOsDescriptor.GuestOsIdentifier.html disksize = (1024 ** 2) * 100 # In Kb: 1024 ** 2 (power) = 1GB; 1GB * 100 = 100GB. # OPTIONAL PARAMETERS datastorename = opts.datastore # if None, will use the first datastore available # CONNECT TO THE SERVER s = VIServer() s.connect(server, user, password) # GET INITIAL PROPERTIES AND OBJECTS # get datacenter dcmor = s._get_datacenters()[datacentername] dcprops = VIProperty(s, dcmor) # get host folder hfmor = dcprops.hostFolder._obj # get computer resources crmors = s._retrieve_properties_traversal(property_names=['name', 'host'], from_node=hfmor, obj_type='ComputeResource') # get host for hosts in s.get_hosts().items(): try: if hosts.index(hostname) == 1: hostmor = hosts[0] except: pass # get computer resource of this host crmor = None for cr in crmors: if crmor: break for p in cr.PropSet: # print 'p.Name:', p.Name if p.Name == "host": for h in p.Val.get_element_ManagedObjectReference(): if h == hostmor: crmor = cr.Obj break if crmor: break crprops = VIProperty(s, crmor) # get resource pool rpmor = crprops.resourcePool._obj # get vmFolder vmfmor = dcprops.vmFolder._obj # CREATE VM CONFIGURATION # get config target request = VI.QueryConfigTargetRequestMsg() _this = request.new__this(crprops.environmentBrowser._obj) _this.set_attribute_type(crprops.environmentBrowser._obj.get_attribute_type()) request.set_element__this(_this) h = request.new_host(hostmor) h.set_attribute_type(hostmor.get_attribute_type()) request.set_element_host(h) config_target = s._proxy.QueryConfigTarget(request)._returnval # get default devices request = VI.QueryConfigOptionRequestMsg() _this = request.new__this(crprops.environmentBrowser._obj) _this.set_attribute_type(crprops.environmentBrowser._obj.get_attribute_type()) request.set_element__this(_this) h = request.new_host(hostmor) h.set_attribute_type(hostmor.get_attribute_type()) request.set_element_host(h) config_option = s._proxy.QueryConfigOption(request)._returnval defaul_devs = config_option.DefaultDevice # get network name # would be assigned to the last known working network interface. # in this case, it would be VM Network 2. network_name = None for n in config_target.Network: if n.Network.Accessible: network_name = n.Network.Name # can hard-code it as 'VM Network' # get datastore # Just verifies that the datastorename mentioned at the top matches with the # available list of datastores. ds = None for d in config_target.Datastore: if d.Datastore.Accessible and (datastorename and d.Datastore.Name == datastorename) or (not datastorename): ds = d.Datastore.Datastore datastorename = d.Datastore.Name break if not ds: raise Exception("couldn't find datastore") volume_name = "[%s]" % datastorename # add parameters to the create vm task create_vm_request = VI.CreateVM_TaskRequestMsg() config = create_vm_request.new_config() vmfiles = config.new_files() vmfiles.set_element_vmPathName(volume_name) config.set_element_files(vmfiles) config.set_element_name(vmname) config.set_element_annotation(annotation) config.set_element_memoryMB(memorysize) config.set_element_numCPUs(cpucount) config.set_element_guestId(guestosid) devices = [] # add a scsi controller disk_ctrl_key = 1 scsi_ctrl_spec = config.new_deviceChange() scsi_ctrl_spec.set_element_operation('add') scsi_ctrl = VI.ns0.VirtualLsiLogicController_Def("scsi_ctrl").pyclass() scsi_ctrl.set_element_busNumber(0) scsi_ctrl.set_element_key(disk_ctrl_key) scsi_ctrl.set_element_sharedBus("noSharing") scsi_ctrl_spec.set_element_device(scsi_ctrl) devices.append(scsi_ctrl_spec) # find ide controller ide_ctlr = None for dev in defaul_devs: if dev.typecode.type[1] == "VirtualIDEController": ide_ctlr = dev # add a cdrom based on a physical device if ide_ctlr: cd_spec = config.new_deviceChange() cd_spec.set_element_operation('add') cd_ctrl = VI.ns0.VirtualCdrom_Def("cd_ctrl").pyclass() cd_device_backing = VI.ns0.VirtualCdromIsoBackingInfo_Def("cd_device_backing").pyclass() ds_ref = cd_device_backing.new_datastore(ds) ds_ref.set_attribute_type(ds.get_attribute_type()) cd_device_backing.set_element_datastore(ds_ref) cd_device_backing.set_element_fileName("%s %s" % (volume_name, cd_iso_location)) cd_ctrl.set_element_backing(cd_device_backing) cd_ctrl.set_element_key(20) cd_ctrl.set_element_controllerKey(ide_ctlr.get_element_key()) cd_ctrl.set_element_unitNumber(0) cd_spec.set_element_device(cd_ctrl) devices.append(cd_spec) # create a new disk - file based - for the vm disk_spec = config.new_deviceChange() disk_spec.set_element_fileOperation("create") disk_spec.set_element_operation("add") disk_ctlr = VI.ns0.VirtualDisk_Def("disk_ctlr").pyclass() disk_backing = VI.ns0.VirtualDiskFlatVer2BackingInfo_Def("disk_backing").pyclass() disk_backing.set_element_fileName(volume_name) disk_backing.set_element_diskMode("persistent") disk_backing.ThinProvisioned = True disk_ctlr.set_element_key(0) disk_ctlr.set_element_controllerKey(disk_ctrl_key) disk_ctlr.set_element_unitNumber(0) disk_ctlr.set_element_backing(disk_backing) disk_ctlr.set_element_capacityInKB(disksize) disk_spec.set_element_device(disk_ctlr) devices.append(disk_spec) # add a NIC. the network Name must be set as the device name to create the NIC. nic_spec = config.new_deviceChange() if network_name: nic_spec.set_element_operation("add") nic_ctlr = VI.ns0.VirtualPCNet32_Def("nic_ctlr").pyclass() nic_backing = VI.ns0.VirtualEthernetCardNetworkBackingInfo_Def("nic_backing").pyclass() nic_backing.set_element_deviceName(network_name) nic_ctlr.set_element_addressType("generated") nic_ctlr.set_element_backing(nic_backing) nic_ctlr.set_element_key(4) nic_spec.set_element_device(nic_ctlr) devices.append(nic_spec) config.set_element_deviceChange(devices) create_vm_request.set_element_config(config) folder_mor = create_vm_request.new__this(vmfmor) folder_mor.set_attribute_type(vmfmor.get_attribute_type()) create_vm_request.set_element__this(folder_mor) rp_mor = create_vm_request.new_pool(rpmor) rp_mor.set_attribute_type(rpmor.get_attribute_type()) create_vm_request.set_element_pool(rp_mor) host_mor = create_vm_request.new_host(hostmor) host_mor.set_attribute_type(hostmor.get_attribute_type()) create_vm_request.set_element_host(host_mor) # CREATE THE VM taskmor = s._proxy.CreateVM_Task(create_vm_request)._returnval task = VITask(taskmor, s) task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR]) if task.get_state() == task.STATE_ERROR: raise Exception("Error creating vm: %s" % task.get_error_message()) # Here you should power your VM (refer to the pysphere documentation) # So it boots from the specified ISO location try: new_vm = s.get_vm_by_name(opts.name) connect_vm_cdroms(new_vm, s) try: new_vm.power_on() except Exception as e: print "Failed to power-on the new VM using:", opts.name print "Exception:", str(e) except Exception as e: print "Failed to locate the new VM using:", opts.name print "Exception:", str(e) # disconnect from the server s.disconnect()
import string from pysphere import VIServer server = VIServer() HOST = "HostnameOrIPAddress" USER = "******" PASSWORD = "******" server.connect(HOST, USER, PASSWORD) pm = server.get_performance_manager() prefix = "vsphere.hosts." for hs_mor, name in server.get_hosts().items(): # print "Host ", name counters = pm.get_entity_counters(hs_mor) # for counter in counters: # print counter # print counter.values() # for counter in counters.values(): # print counter # gphHostName = changeHostName(name) # gphHostName = name.maketrans('.','_') gphHostName = name.replace('.','_') for counter_name, counter_val in counters.items(): # print counter_name, " ", counter_val stats = pm.get_entity_statistic(hs_mor, counter_val) # print stats if not stats: print "Nothing" for stat in stats: #print "Counter ",stat.counter #print "Value ",stat.value
def invert(d): return dict(zip(d.values(), d.keys())) def getClusterByName(server, name): return invert(server.get_clusters()).get(name, None) cluster_mor = getClusterByName(server, args.cluster) vmlist = server.get_registered_vms(cluster=cluster_mor, status='powered' + args.state) # https://groups.google.com/forum/#!topic/pysphere/UCL7epa_sFU hosts = server.get_hosts() for vmpath in vmlist: vm = server.get_vm_by_path(vmpath) host_mor = vm.properties.runtime.host._obj # print vm.properties.runtime.host.name if args.hosts: print vm.get_property('name'), hosts[host_mor] elif args.datastores: print vm.get_property('name'), vm.properties.datastore[0].name else: print vm.get_property('name') server.disconnect()
def get_host_info(host_ip,host_name,host_password): hosts_dict_data = [] server = VIServer() server.connect(host_ip, host_name, host_password) #print 'VC connect successful...' #DebugInfo.objects.create(text_info='VC connect successful...') for d, hname in server.get_hosts().items(): HostMemoryUsage = 0 HostCpuUsage = 0 HostTotalMemory = 0 HostNumCpuCores = 0 HostMhzPerCore = 0 HostStatus = '' props = server._retrieve_properties_traversal(property_names=[ 'name', 'summary.overallStatus', 'summary.quickStats.overallMemoryUsage', 'summary.quickStats.overallCpuUsage', 'summary.hardware.memorySize', 'summary.hardware.numCpuCores', 'summary.hardware.cpuMhz', 'hardware.biosInfo', 'hardware.systemInfo', 'summary.runtime.healthSystemRuntime.hardwareStatusInfo.cpuStatusInfo', 'summary.runtime.healthSystemRuntime.hardwareStatusInfo.memoryStatusInfo', 'summary.runtime.healthSystemRuntime.hardwareStatusInfo.storageStatusInfo' ], from_node=d, obj_type="HostSystem") for prop_set in props: # mor = prop_set.Obj #in case you need it for prop in prop_set.PropSet: if prop.Name == "summary.quickStats.overallMemoryUsage": HostMemoryUsage = prop.Val elif prop.Name == "summary.quickStats.overallCpuUsage": HostCpuUsage = prop.Val elif prop.Name == "summary.hardware.memorySize": HostTotalMemory = (prop.Val / 1048576) elif prop.Name == "summary.hardware.numCpuCores": HostNumCpuCores = prop.Val elif prop.Name == "summary.hardware.cpuMhz": HostMhzPerCore = prop.Val elif prop.Name == "summary.overallStatus": HostStatus = prop.Val if HostStatus == "green": HostStatus = 0 elif HostStatus == "gray": HostStatus = 1 elif HostStatus == "yellow": HostStatus = 2 elif HostStatus == "red": HostStatus = 3 elif prop.Name == "hardware.biosInfo": HostBiosInfo = prop.Val.__dict__['_biosVersion'] # print HostBiosInfo elif prop.Name == "hardware.systemInfo": HostSystemInfo = prop.Val.__dict__ HostType = HostSystemInfo['_model'] elif prop.Name == "summary.runtime.healthSystemRuntime.hardwareStatusInfo.cpuStatusInfo": HostHealthInfo_cpu = prop.Val.__dict__ for i in HostHealthInfo_cpu['_HostHardwareElementInfo']: cpu = i.__dict__ cpu1 = cpu['_status'].__dict__ HostCPUHealthInfo = cpu1['_label'] elif prop.Name == "summary.runtime.healthSystemRuntime.hardwareStatusInfo.memoryStatusInfo": HostHealthInfo_memory = prop.Val.__dict__ for i in HostHealthInfo_memory['_HostHardwareElementInfo']: mem = i.__dict__ mem1 = mem['_status'].__dict__ # print mem1 HostMemHealthInfo = mem1['_label'] # print HostMemHealthInfo elif prop.Name == "summary.runtime.healthSystemRuntime.hardwareStatusInfo.storageStatusInfo": HostHealthInfo_storage = prop.Val.__dict__ HostRunningVMS = len(server.get_registered_vms(d, status='poweredOn')) HostStoppedVMS = len(server.get_registered_vms(d, status='poweredOff')) HostTotalVMS = len(server.get_registered_vms(d)) HostCpuTotal = (HostNumCpuCores * HostMhzPerCore) HostMemoryUsagePercent = round((HostMemoryUsage * 100) / HostTotalMemory,2) HostCpuUsagePercent = round(((HostCpuUsage * 100) / HostCpuTotal),2) hosts_dict = {'hostnumber':d, 'hostname': hname.lower(), 'hoststatus': HostStatus, 'hostmemoryusage': HostMemoryUsage, 'hostcpuusage': HostCpuUsage, 'hosttotalmemory': HostTotalMemory, 'hostcputotal': HostCpuTotal, 'hostmemoryusagepercent': HostMemoryUsagePercent, 'hostcpuusagepercent': HostCpuUsagePercent, 'hostrunningvms': HostRunningVMS, 'hoststoppedvms': HostStoppedVMS, 'hosttotalvms': HostTotalVMS, 'hostbiosinfo': HostBiosInfo, 'hosttype': HostType, 'hostcpuhealthinfo': HostCPUHealthInfo} hosts_dict_data.append(hosts_dict) server.disconnect() return hosts_dict_data
logger.debug('First set of properties: %s' % properties) properties2 = create_me_props() 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)))
class Server: """Vsphere server that a client can connect to""" SUPPORTED_FILTER_KEYWORDS = ["uuidSpec", "pathSpec", "nameSpec"] url = os.getenv("VSPHERE_URL") """URL of vSphere endpoint""" # : vSphere account username username = os.getenv("VSPHERE_USER") # : vSphere account password password = os.getenv("VSPHERE_PASSWORD") def __init__(self, url=None, username=None, password=None): """Constructs an Server instance with given endpoint and credentials :param url: end point hostname/URL to connect to. As of this release, url must be an http url with port 80, e.g. like this: http://vsphere.example.com :param username: vSphere account username :param password: vSphere account password """ self._server = VIServer() self._vm_datacenters = {} # don't set to None if already set from environment if url: self.url = url if username: self.username = username if password: self.password = password def connect(self, url=None, username=None, password=None): """Connects to vSphere server using optional arguments that may override those in Server constructor. If arguments are not given, previously specified arguments will be used for connection in this order: * last connect arguments (if specified) * constructor arguments (if specified) * environment variables If none of the above is specified, the exception MissingArgumentException is raised :type url: string :param url: end point hostname/URL to connect to :type username: string :param username: vSphere account username :type password: string :param password: vSphere account password :type password: string :param password: vSphere account password """ if url: self.url = url if username: self.username = username if password: self.password = password # check if all needed properties available for connect argErrors = [] if not self.url: argErrors.append("url unknown") if not self.username: argErrors.append("username unknown") if not self.password: argErrors.append("password unknown") if argErrors: raise MissingArgumentError(" ".join(argErrors)) # parse host from url host = urlparse(self.url).hostname # perform connect logger.debug("connect: %s; %s" % (url, username)) self._server.connect(host, self.username, self.password, trace_file=prototrace_file) def disconnect(self): """Disconnects from vSphere server""" self._server.disconnect() self._server = [] def power_on_vm(self, instanceUuid, sync_run=True, host=None): """Powers on a virtual machine for a given instanceUuid""" return self._get_instance(instanceUuid).power_on(sync_run, host) def power_off_vm(self, instanceUuid, sync_run=True): """Powers off a virtual machine for a given instanceUuid""" return self._get_instance(instanceUuid).power_off(sync_run) def clone_vm(self, instanceUuid, name=None, sync_run=True, host=None): """Clones a virtual machine for a given instanceUuid. :param instanceUuid: instanceUuid of VM to clone :param name: name to give to the cloned machine. if None, a new name will be generated using the original instance name with time stamp appended, e.g.: 'ubuntu_csk1_08-1349968939' """ import time instance = self._get_instance(instanceUuid) if not name: name = "%s-%d" % (instance.get_property("name"), time.time()) return instance.clone(name, sync_run, host=host) def reset_vm(self, instanceUuid, sync_run=True): """Powers off a virtual machine for a given instanceUuid""" return self._get_instance(instanceUuid).reset(sync_run) def suspend_vm(self, instanceUuid, sync_run=True): """Suspends a virtual machine for a given instanceUuid""" return self._get_instance(instanceUuid).suspend(sync_run) def list_instances(self, instanceUuid=None, filter=None, datacenter=None): """Lists all vmware instances that match the given filter. :type instanceUuid: string :param instanceUuid: InstanceUuid to filter on. This is a convenience parameter that will override a corresponding value in filter, if it exists. :param datacenter: name of datacenter to filter VMs registered in that datacenter :type filter: dict :param filter: represents a filter specification and can consist of any valid properties, such as { 'config.instanceUuid': [ '50398c64-55ad-7eb2-f14a-6f70b6903b06' ] } or {'runtime.powerState': ['poweredOn']} or {'runtime.powerState': ['poweredOff'], 'config.instanceUuid': [ '50398c64-55ad-7eb2-f14a-6f70b6903b06' ] } :rtype: list :return: A list of :class:`vmware.vsphere.VM` """ # get the vm paths if instanceUuid and len(instanceUuid): if not isinstance(instanceUuid, str): raise BadParameterError("instanceUuid parameter must be a string") if not filter: filter = {} filter["config.instanceUuid"] = [instanceUuid] self._vmspaths = self._server.get_registered_vms(datacenter, advanced_filters=filter) logger.debug("list_instances: retrieved %d vm paths" % len(self._vmspaths)) # instantiate instances for vm paths self.vms = [] for p in self._vmspaths: self.vms.append(VM(p, self)) # first time this function runs, fetch information about vm to datacenter mapping self._fetch_datacenter_vms() return self.vms def get_hosts(self, datacenter=None): """Returns a dictionary of the existing hosts keys are their names and values their ManagedObjectReference object. Example usage: >>> server.get_hosts() {'host-23': '108.61.71.220', 'host-19': '108.61.71.219', 'host-36': '173.71.195.168'} >>> server.get_hosts('datacenter-12') >>> from catosphere import Server >>> server = Server() >>> server.connect() >>> server.get_datacenters() {'datacenter-12': 'csk3', 'datacenter-2': 'csk1', 'datacenter-7': 'csk2'} >>> server.get_hosts('datacenter-2') {'host-23': '108.61.71.220', 'host-19': '108.61.71.219'} >>> server.get_hosts('datacenter-7') {'host-36': '173.71.195.168'} >>> server.get_hosts('datacenter-12') {} >>> server.get_hosts() {'host-23': '108.61.71.220', 'host-19': '108.61.71.219', 'host-36': '173.71.195.168'} >>> server.disconnect() :return: a dict e.g. {'host-23': '108.61.71.220', 'host-19': '108.61.71.219', 'host-36': '173.71.195.168'} if not hosts are found, empty dict is returned. """ if datacenter: hosts = self._server._get_managed_objects(MORTypes.HostSystem, from_mor=datacenter) else: hosts = self._server.get_hosts() return hosts def get_datacenters(self): """Returns a dictionary of the existing datacenters. keys are their ManagedObjectReference objects and values their names. :return: a dict e.g. {'datacenter-12': 'csk3', 'datacenter-2': 'csk1', 'datacenter-7': 'csk2'} """ return self._server.get_datacenters() # ****************************************************** # ***************** Private Methods ******************* # ****************************************************** def _fetch_datacenter_vms(self): """ Fetch/cache datacenter vm mapping information. This can be later used to retrieve datacenter information for each VM. """ if not self._vm_datacenters: dcs = self.get_datacenters() for name in dcs.keys(): self._vm_datacenters[name] = self._server._get_managed_objects(MORTypes.VirtualMachine, from_mor=name) # logger.debug(': _vm_datacenters: %s' % self._vm_datacenters) def _get_instance(self, instanceUuid): """ Retrieves instance by its instanceUuid. TODO: make this faster by caching instances. """ instances = self.list_instances(instanceUuid) if not instances: raise InstanceNotFoundError("Instance %s not found" % instanceUuid) else: return instances[0]
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) else: ERROR(ErrorCode.E_MISSING_VM,appid," (%s)" % vm) continue
if key.Val == portgroupKey: dvswitch_mor = dvswitch # Get the switches uuid dvswitch_uuid = None for p in dvswitch_mor.PropSet: if p.Name == "uuid": dvswitch_uuid = p.Val # hostFolder managed object reference hfmor = dcprops.hostFolder._obj crmors = s._retrieve_properties_traversal(property_names=['name', 'host'], from_node=hfmor, obj_type='ComputeResource') hostmor = [k for k, v in s.get_hosts().items() if v == hostname][0] crmor = None 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)
def get_uuid(server, hostkey): hmor = VIMor(hostkey, MORTypes.HostSystem) prop = VIProperty(server, hmor) for item in prop.datastore: print item.info.name print dir(item.info) return prop.hardware.systemInfo.uuid res = [] for ip in iplist: url = "https://%s/sdk" % ip print print url, username, password try: server.connect(url, username, password) print "login success!" hosts = server.get_hosts() for k, v in hosts.items(): print "get_uuid(%s)" % k uuid = get_uuid(server, k) res.append({"id": k, "host": v, "uuid": uuid}) sort_json([k, v, uuid]) server.disconnect() except BaseException as e: print "login failed! <%s>" % str(e)
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)
class Creator: # todo; add comment """ """ def __init__(self, manager_address, manager_user, manager_password): """ :param manager_address: :param manager_user: :param manager_password: """ self.esx_server = VIServer() self.esx_address = manager_address self.esx_user = manager_user self.esx_password = manager_password def __del__(self): self._disconnect_from_esx() # todo; add comment def _connect_to_esx(self): """ :raise: """ if not self.esx_server.is_connected(): try: self.esx_server.connect(self.esx_address, self.esx_user, self.esx_password) except Exception as inst: raise CreatorException(str(inst)) def _disconnect_from_esx(self): # todo; add comment """ """ if self.esx_server.is_connected(): self.esx_server.disconnect() def create_resource_pool( self, name, parent_rp="/", esx_hostname=None, cpu_resources=("normal", 4000, 0, True, -1), memory_resources=("normal", 163840, 0, True, -1), ): """ Creates a resource pool on esx server name - name for new resource pool parent_pr - parent resource pool esx_hostname - host name of esx server when resource pool will be created cpu_resources and memory_resources: tuple 0:share level - 'low' 'normal' 'high' 'custom' 1:share value - 'custom' share value, int 2:reservation - reserved CPU/Memory, int 3:expandable reservation - bool 4:limit - -1 - unlimited, another value - limit value, int :raise: CreatorException """ self._connect_to_esx() if parent_rp == "/": parent_rpmor = None try: rp_mor_temp = [k for k, v in self.esx_server.get_resource_pools().items() if v == "/Resources"] except IndexError: raise CreatorException("Couldn't find parent resource pool") if len(rp_mor_temp) == 0: raise CreatorException("Couldn't find parent resource pool") if esx_hostname: for rp in rp_mor_temp: prop = VIProperty(self.esx_server, rp) if prop.parent.name == esx_hostname: parent_rpmor = rp break if not parent_rpmor: raise CreatorException("Couldn't find host") else: parent_rpmor = rp_mor_temp[0] else: parent_rp = "/Resources" + parent_rp parent_rpmor = None try: parent_rp_temp = [k for k, v in self.esx_server.get_resource_pools().items() if v == parent_rp] except IndexError: raise CreatorException("Couldn't find parent a resource pool") if len(parent_rp_temp) == 0: raise CreatorException("Couldn't find parent a resource pool") ##222 if len(parent_rp_temp) == 1: parent_rpmor = parent_rp_temp[0] elif esx_hostname: for rp in parent_rp_temp: prop = VIProperty(self.esx_server, rp) while prop.parent.name != "host": prop = prop.parent if prop.name == esx_hostname: parent_rpmor = rp break else: raise CreatorException("ESX Hostname must be specified") req = VI.CreateResourcePoolRequestMsg() _this = req.new__this(parent_rpmor) _this.set_attribute_type(parent_rpmor.get_attribute_type()) req.set_element__this(_this) req.Name = name spec = req.new_spec() cpu_allocation = spec.new_cpuAllocation() memory_allocation = spec.new_memoryAllocation() # cpu allocation settings shares = cpu_allocation.new_shares() shares.Level = cpu_resources[0] shares.Shares = cpu_resources[1] cpu_allocation.Shares = shares cpu_allocation.Reservation = cpu_resources[2] cpu_allocation.ExpandableReservation = cpu_resources[3] cpu_allocation.Limit = cpu_resources[4] spec.CpuAllocation = cpu_allocation # memory allocation settings shares = memory_allocation.new_shares() shares.Level = memory_resources[0] shares.Shares = memory_resources[1] memory_allocation.Shares = shares memory_allocation.Reservation = memory_resources[2] memory_allocation.ExpandableReservation = memory_resources[3] memory_allocation.Limit = memory_resources[4] spec.MemoryAllocation = memory_allocation req.Spec = spec try: self.esx_server._proxy.CreateResourcePool(req) except Exception as inst: self._disconnect_from_esx() inst = str(inst) if "already exist" in inst: raise ExistenceException("Couldn't create resource pool '%s', because it already exist" % name) else: raise CreatorException("Couldn't create the resource pool with name '%s'" % name) def destroy_resource_pool(self, name, esx_hostname=None): """ Destroy named resource pool; vm included in this pool will be thrown on upper resource pool :param esx_hostname: host name of esx server, which contains resource pool :param name: name of resource pool :raise: CreatorException, ExistenceException """ self._connect_to_esx() if name[0] != "/": rp_name = "/Resources/" + name else: rp_name = "/Resources" + name try: rp_mor_temp = [k for k, v in self.esx_server.get_resource_pools().items() if v == rp_name] except IndexError: raise ExistenceException("Couldn't find resource pool '%s'" % name) rpmor = "" if esx_hostname: for rp in rp_mor_temp: prop = VIProperty(self.esx_server, rp) while prop.parent.name != "host": prop = prop.parent if prop.name == esx_hostname: rpmor = rp break elif len(rp_mor_temp) == 1: rpmor = rp_mor_temp[0] else: raise CreatorException("ESX Hostname must be specified") req = VI.Destroy_TaskRequestMsg() _this = req.new__this(rpmor) _this.set_attribute_type(rpmor.get_attribute_type()) req.set_element__this(_this) try: self.esx_server._proxy.Destroy_Task(req) # self._disconnect_from_esx() except Exception: self._disconnect_from_esx() raise def destroy_resource_pool_with_vms(self, name, esx_hostname=None): """ Destroy named resource pool; vm included in this pool also will be destroyed :param name: name of resource pool :param esx_hostname: host name of esx server, which contains resource pool :raise: CreatorException, ExistenceException """ self._connect_to_esx() if not name: raise CreatorException("Couldn't specify resource pool name") if name[0] != "/": rp_name = "/Resources/" + name else: rp_name = "/Resources" + name try: rp_mor_temp = [k for k, v in self.esx_server.get_resource_pools().items() if v == rp_name] except IndexError: raise CreatorException("Couldn't find resource pool '%s'" % name) rpmor = "" if esx_hostname: for rp in rp_mor_temp: prop = VIProperty(self.esx_server, rp) while prop.parent.name != "host": prop = prop.parent if prop.name == esx_hostname: rpmor = rp break elif len(rp_mor_temp) == 1: rpmor = rp_mor_temp[0] else: raise ExistenceException("Couldn't find resource pool '%s'" % name) prop = VIProperty(self.esx_server, rpmor) vms = [str(k.name) for k in prop.vm] for k in vms: self.destroy_vm(k) self.destroy_resource_pool(rp_name[10:], esx_hostname) # self._disconnect_from_esx() def destroy_vm(self, vmname): """ Destroys virtual machine by name :param vmname: virtual machine name :raise: ExistenceException, CreatorException """ self._connect_to_esx() try: vm = self.esx_server.get_vm_by_name(vmname) except Exception as error: self._disconnect_from_esx() raise ExistenceException("Couldn't find VM '%s' - %s" % (vmname, error.message)) try: if vm.is_powered_on() or vm.is_powering_off() or vm.is_reverting(): vm.power_off() request = VI.Destroy_TaskRequestMsg() _this = request.new__this(vm._mor) _this.set_attribute_type(vm._mor.get_attribute_type()) request.set_element__this(_this) ret = self.esx_server._proxy.Destroy_Task(request)._returnval # Wait for the task to finish task = VITask(ret, self.esx_server) status = task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR]) if status != task.STATE_SUCCESS: raise CreatorException("Couldn't destroy vm - " + task.get_error_message()) except Exception: self._disconnect_from_esx() raise CreatorException("Couldn't destroy the virtual machine %s" % vmname) def create_vm_old( self, vmname, esx_hostname=None, iso=None, datacenter=None, resource_pool="/", networks=None, datastore=None, description=None, guestosid="debian4Guest", memorysize=512, cpucount=1, disk_space=1048576, ): """ Creates virtual machine :param vmname: name of virtual machine :param esx_hostname: host's name, when vm will be created; if not specified and ESX contains more than 1 hosts - raise CreatorException :param iso: path to .ISO image; must be stored in the same datastore as the virtual machine is created :param datacenter: name of datacenter, which contain hosts and datastores :param resource_pool: name of resource pool, when VM will be created (e.g. win-servers/win2003) if resource_pool_path is not defined, VM will created in root of inventory :param networks: list of existing port groups. NIC are based on this list :param datastore: name of datastore, which will be contain VM files; if not specified, VM will be placed in first datastore, which is avaliable for chosen host :param description: description for VM :param guestosid: ID for guest OS; full list http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.vm.GuestOsDescriptor.GuestOsIdentifier.html :param memorysize: size of RAM, which will be avaliable on VM, in Mb :param cpucount: count of CPU, which will be avaliable on VM :param create_hard_drive: if True, new .vmdk disk will be created and added to VM :param disk_space: hard drive's maximal size, in Kb """ params = {} if vmname: params["vm_name"] = vmname else: raise AttributeError("Couldn't specify a virtual machine name") if iso: params["iso"] = iso if datacenter: params["datacenter_name"] = datacenter if datastore: params["datastore_name"] = datastore if resource_pool: params["resource_pool_name"] = resource_pool if not networks: networks = [] if networks: params["networks"] = networks if not description: params["description"] = "Description of %s" % vmname else: params["description"] = description params["esx_hostname"] = esx_hostname params["guestosid"] = guestosid params["memory_size"] = memorysize params["cpu_count"] = cpucount params["disk_size"] = disk_space try: self.create_vm(params) except ExistenceException as error: raise except CreatorException as error: raise except Exception as error: raise def create_vm(self, vm_options): """ Creates a virtual machine on ESXi server :param vm_options: dict, which contain parameters for VM 'vm_name' 'iso' 'datacenter_name' 'datastore_name' 'resource_pool_name' 'networks' 'description' 'esx_hostname' 'hard_drive' 'guestosid' 'memory_size' 'cpu_count' 'disk_size' See create_vm_old for details :raise: CreatorException, ExistenceException """ self._connect_to_esx() # VM NAME vm_name = None try: vm_name = str(vm_options["vm_name"]) vm_temp = self.esx_server.get_vm_by_name(vm_name) if vm_temp: raise ExistenceException('VM "%s" already exists' % vm_name) except KeyError: raise CreatorException("Must specify VM name") except pysphere.VIException as inst: if "[Object Not Found]" in str(inst): pass # HOSTNAME hosts = self.esx_server.get_hosts() try: esx_hostname = vm_options["esx_hostname"] if not esx_hostname: raise KeyError elif not (esx_hostname in hosts.values()): raise CreatorException("Couldn't find host '%s'" % esx_hostname) except KeyError: if len(hosts.values()) > 1: raise CreatorException("More than 1 host - must specify ESX Hostname") elif not hosts.values(): raise CreatorException("Couldn't find available host") esx_hostname = hosts[0] # MOR and PROPERTIES hostmor = [k for k, v in hosts.items() if v == esx_hostname][0] hostprop = VIProperty(self.esx_server, hostmor) # DATACENTER - FIX EXCEPTION # todo: fix self.esx_server.get_datacenters().values() dcs = self.esx_server.get_datacenters() dc_values = dcs.values() try: dc_name = vm_options["datacenter_name"] if not dc_name in dc_values: raise CreatorException("Couldn't find datacenter '%s'" + dc_name) except KeyError: if len(dc_values) > 1: raise CreatorException("More than 1 datacenter - must specify ESX Hostname") elif not dc_values: raise CreatorException("Couldn't find available datacenter") dc_name = dc_values[0] # MOR and PROPERTIES dcmor = [k for k, v in dcs.items() if v == dc_name][0] dcprops = VIProperty(self.esx_server, dcmor) # DATASTORE dcs = hostprop.datastore try: ds_name = vm_options["datastore_name"] ds_list = [] for ds in dcs: ds_list.append(ds.name) if not ds_name in ds_list: raise CreatorException("Couldn't find datastore or datastore is not available") except KeyError: if len(dcs) > 1: raise CreatorException("More than 1 datastore on ESX - must specify datastore name") elif not dcs: raise CreatorException("Couldn't find available datastore") ds_name = dcs[0].name # RESOURCE POOL resource_pool_name = "" try: resource_pool_name = vm_options["resource_pool_name"] if resource_pool_name == "/": pass elif resource_pool_name[0] != "/": resource_pool_name = "/{0}".format(resource_pool_name) except KeyError: resource_pool_name = "/" finally: rpmor = self._fetch_resource_pool(resource_pool_name, esx_hostname) if not rpmor: raise CreatorException("Couldn't find resource pool '%s'" % resource_pool_name) # NETWORKS try: networks = list(vm_options["networks"]) except Exception: networks = [] try: iso = vm_options["iso"] if iso == False: iso = None else: # todo: hide magic iso = iso[iso.find(ds_name) + len(ds_name) + 1 :] except KeyError: iso = None # Description try: description = vm_options["description"] except KeyError: description = "Description for VM %s" % vm_name try: guestosid = vm_options["guestosid"] except KeyError: guestosid = "otherGuest" try: memory_size = int(vm_options["memory_size"]) if memory_size <= 0: raise CreatorException("Disk size must be greater than 0") except Exception: memory_size = DEFAULT_MEMORY_SIZE # MB try: cpu_count = int(vm_options["cpu_count"]) except Exception: cpu_count = DEFAULT_CPU_COUNT try: disk_size = int(vm_options["disk_size"]) if disk_size < 0: raise CreatorException("Disk size must be greater than 0") except Exception: disk_size = DEFAULT_DISK_SIZE # KB crprops = self._fetch_computer_resource(dcprops, hostmor) vmfmor = dcprops.vmFolder._obj # CREATE VM CONFIGURATION # get config target request = VI.QueryConfigTargetRequestMsg() _this = request.new__this(crprops.environmentBrowser._obj) _this.set_attribute_type(crprops.environmentBrowser._obj.get_attribute_type()) request.set_element__this(_this) h = request.new_host(hostmor) h.set_attribute_type(hostmor.get_attribute_type()) request.set_element_host(h) config_target = self.esx_server._proxy.QueryConfigTarget(request)._returnval # get default devices request = VI.QueryConfigOptionRequestMsg() _this = request.new__this(crprops.environmentBrowser._obj) _this.set_attribute_type(crprops.environmentBrowser._obj.get_attribute_type()) request.set_element__this(_this) h = request.new_host(hostmor) h.set_attribute_type(hostmor.get_attribute_type()) request.set_element_host(h) config_option = self.esx_server._proxy.QueryConfigOption(request)._returnval defaul_devs = config_option.DefaultDevice # get network name avaliable_networks = 0 for net in networks: for n in config_target.Network: if n.Network.Accessible and n.Network.Name == net: avaliable_networks += 1 break if len(networks) != avaliable_networks: msg = "" for n in config_target.Network: msg = "%s %s" % (msg, str(n.Network.Name)) raise CreatorException("Couldn't find all networks; founded: %s" % msg) # raise ExistenceException("Couldn't find network") # get datastore ds = None for d in config_target.Datastore: if d.Datastore.Accessible and d.Datastore.Name == ds_name: ds = d.Datastore.Datastore ds_name = d.Datastore.Name break if not ds: raise CreatorException("Datastore is not available") volume_name = "[%s]" % ds_name # add parameters to the create vm task create_vm_request = VI.CreateVM_TaskRequestMsg() config = create_vm_request.new_config() vmfiles = config.new_files() vmfiles.set_element_vmPathName(volume_name) config.set_element_files(vmfiles) config.set_element_name(vm_name) config.set_element_annotation(description) config.set_element_memoryMB(memory_size) config.set_element_numCPUs(cpu_count) config.set_element_guestId(guestosid) devices = [] # add a scsi controller disk_ctrl_key = 1 scsi_ctrl_spec = config.new_deviceChange() scsi_ctrl_spec.set_element_operation("add") scsi_ctrl = VI.ns0.VirtualLsiLogicController_Def("scsi_ctrl").pyclass() scsi_ctrl.set_element_busNumber(0) scsi_ctrl.set_element_key(disk_ctrl_key) scsi_ctrl.set_element_sharedBus("noSharing") scsi_ctrl_spec.set_element_device(scsi_ctrl) devices.append(scsi_ctrl_spec) # find ide controller if iso: ide_ctlr = None for dev in defaul_devs: if dev.typecode.type[1] == "VirtualIDEController": ide_ctlr = dev # add a cdrom based on a physical device if ide_ctlr: cd_spec = config.new_deviceChange() cd_spec.set_element_operation("add") cd_ctrl = VI.ns0.VirtualCdrom_Def("cd_ctrl").pyclass() cd_device_backing = VI.ns0.VirtualCdromIsoBackingInfo_Def("cd_device_backing").pyclass() ds_ref = cd_device_backing.new_datastore(ds) ds_ref.set_attribute_type(ds.get_attribute_type()) cd_device_backing.set_element_datastore(ds_ref) cd_device_backing.set_element_fileName("%s %s" % (volume_name, iso)) cd_ctrl.set_element_backing(cd_device_backing) cd_ctrl.set_element_key(20) cd_ctrl.set_element_controllerKey(ide_ctlr.get_element_key()) cd_ctrl.set_element_unitNumber(0) cd_spec.set_element_device(cd_ctrl) devices.append(cd_spec) # create a new disk - file based - for the vm if disk_size != 0: disk_spec = config.new_deviceChange() disk_spec.set_element_fileOperation("create") disk_spec.set_element_operation("add") disk_ctlr = VI.ns0.VirtualDisk_Def("disk_ctlr").pyclass() disk_backing = VI.ns0.VirtualDiskFlatVer2BackingInfo_Def("disk_backing").pyclass() disk_backing.set_element_fileName(volume_name) disk_backing.set_element_diskMode("persistent") disk_ctlr.set_element_key(0) disk_ctlr.set_element_controllerKey(disk_ctrl_key) disk_ctlr.set_element_unitNumber(0) disk_ctlr.set_element_backing(disk_backing) disk_ctlr.set_element_capacityInKB(disk_size) disk_spec.set_element_device(disk_ctlr) devices.append(disk_spec) # add a NIC. the network Name must be set as the device name to create the NIC. for network_name in networks: nic_spec = config.new_deviceChange() nic_spec.set_element_operation("add") nic_ctlr = VI.ns0.VirtualPCNet32_Def("nic_ctlr").pyclass() nic_backing = VI.ns0.VirtualEthernetCardNetworkBackingInfo_Def("nic_backing").pyclass() nic_backing.set_element_deviceName(network_name) nic_ctlr.set_element_addressType("generated") nic_ctlr.set_element_backing(nic_backing) nic_ctlr.set_element_key(4) nic_spec.set_element_device(nic_ctlr) devices.append(nic_spec) config.set_element_deviceChange(devices) create_vm_request.set_element_config(config) folder_mor = create_vm_request.new__this(vmfmor) folder_mor.set_attribute_type(vmfmor.get_attribute_type()) create_vm_request.set_element__this(folder_mor) rp_mor = create_vm_request.new_pool(rpmor) rp_mor.set_attribute_type(rpmor.get_attribute_type()) create_vm_request.set_element_pool(rp_mor) host_mor = create_vm_request.new_host(hostmor) host_mor.set_attribute_type(hostmor.get_attribute_type()) create_vm_request.set_element_host(host_mor) # CREATE THE VM - add option "wait" taskmor = self.esx_server._proxy.CreateVM_Task(create_vm_request)._returnval task = VITask(taskmor, self.esx_server) task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR]) if task.get_state() == task.STATE_ERROR: self._disconnect_from_esx() raise CreatorException("Error creating vm: %s" % task.get_error_message()) def create_virtual_switch(self, name, num_ports, esx_hostname=None): """ Creates a new standard virtual switch on esx :param name: name for new virtual switch :param num_ports: numbers of emulated ports :param esx_hostname: host name of esx server when virtual switch will be created :raise: CreatorException, ExistenceException """ num_ports = int(num_ports) self._connect_to_esx() hosts = None try: hosts = self.esx_server.get_hosts() if esx_hostname: host_system = [k for k, v in hosts.items() if v == esx_hostname][0] else: host_system = hosts.keys()[0] except IndexError: raise CreatorException("Couldn't find host") if not host_system: raise CreatorException("Couldn't find host") prop = VIProperty(self.esx_server, host_system) network_system = prop.configManager.networkSystem._obj for vs in prop.configManager.networkSystem.networkInfo.vswitch: if vs.name == name: self._disconnect_from_esx() raise ExistenceException("Switch '%s' already exist" % name) request = VI.AddVirtualSwitchRequestMsg() _this = request.new__this(network_system) _this.set_attribute_type(network_system.get_attribute_type()) request.set_element__this(_this) request.set_element_vswitchName(name) spec = request.new_spec() spec.set_element_numPorts(num_ports) request.set_element_spec(spec) try: self.esx_server._proxy.AddVirtualSwitch(request) except Exception: raise CreatorException("Couldn't create Switch") # self._disconnect_from_esx() def destroy_virtual_switch(self, name, esx_hostname=None): """ Destroys a named standard virtual switch on esx :param name: virtual switch's name :param esx_hostname: host name of esx server when virtual switch placed :raise: CreatorException, ExistenceException """ self._connect_to_esx() hosts = self.esx_server.get_hosts() try: if esx_hostname: host_system = [k for k, v in hosts.items() if v == esx_hostname][0] else: host_system = hosts.keys()[0] except Exception: raise CreatorException("Couldn't find host") prop = VIProperty(self.esx_server, host_system) network_system = prop.configManager.networkSystem._obj exist = False for vs in prop.configManager.networkSystem.networkInfo.vswitch: if vs.name == name: exist = True break if exist: request = VI.RemoveVirtualSwitchRequestMsg() _this = request.new__this(network_system) _this.set_attribute_type(network_system.get_attribute_type()) request.set_element__this(_this) request.set_element_vswitchName(name) try: self.esx_server._proxy.RemoveVirtualSwitch(request) except Exception: raise CreatorException("Couldn't remove virtual switch '%s'" % name) else: raise ExistenceException("Couldn't find virtual switch '%s'" % name) # self._disconnect_from_esx() def add_port_group(self, switch_name, vlan_name, esx_hostname=None, vlan_id=4095, promiscuous=False): """ Add new network to exist switch :param switch_name: vlan_name of switch which will be reconfigured :param vlan_name: vlan_name of VLAN :param esx_hostname: ESX hostname :param vlan_id: id for VLAN :param promiscuous: promiscuous mode enable/disable (True/False) :raise: ExistenceException, CreatorException """ self._connect_to_esx() vlan_id = int(vlan_id) hosts = self.esx_server.get_hosts() try: if esx_hostname: host_system = [k for k, v in hosts.items() if v == esx_hostname][0] else: host_system = hosts.keys()[0] except Exception: raise CreatorException("Couldn't find host") prop = VIProperty(self.esx_server, host_system) network_system = prop.configManager.networkSystem._obj request = VI.AddPortGroupRequestMsg() _this = request.new__this(network_system) _this.set_attribute_type(network_system.get_attribute_type()) request.set_element__this(_this) portgrp = request.new_portgrp() portgrp.set_element_name(vlan_name) portgrp.set_element_vlanId(vlan_id) portgrp.set_element_vswitchName(switch_name) policy = portgrp.new_policy() security = policy.new_security() security.set_element_allowPromiscuous(promiscuous) policy.set_element_security(security) portgrp.set_element_policy(policy) request.set_element_portgrp(portgrp) try: self.esx_server._proxy.AddPortGroup(request) except Exception as inst: message = str(inst) if "already exist" in message: raise ExistenceException( "Couldn't create network '%s:%s' on switch '%s', because it already exists" % vlan_name, vlan_id, switch_name, ) else: raise CreatorException( "Couldn't create network '%s:%s' on switch '%s'" % vlan_name, vlan_id, switch_name ) # self._disconnect_from_esx() def is_connected(self): """ Checks ESX manager connection :rtype : bool :return: connection status """ return self.esx_server.is_connected() def vm_power_on(self, vmname): """ Turns power on for the virtual machine :param vmname: virtual machine name :raise: ExistenceException, AttributeError, Exception """ if not vmname: raise AttributeError("Couldn't specify the virtual machine name") if not self._is_vm_exist(vmname): raise ExistenceException("Couldn't find the virtual machine '%s'" % vmname) try: self._connect_to_esx() vm = self.esx_server.get_vm_by_name(vmname) if not vm.is_powered_on() and not vm.is_powering_on(): vm.power_on() except Exception as error: self._disconnect_from_esx() raise CreatorException(error) def vm_power_off(self, vmname): """ Turns power off for the virtual machine :param vmname: virtual machine name :raise: ExistenceException, AttributeError, Exception """ if not vmname: raise AttributeError("Couldn't specify the virtual machine name") if not self._is_vm_exist(vmname): raise ExistenceException("Couldn't find the virtual machine '%s'" % vmname) try: self._connect_to_esx() vm = self.esx_server.get_vm_by_name(vmname) if not vm.is_powered_off() and not vm.is_powering_off(): vm.power_off() except Exception as error: self._disconnect_from_esx() raise CreatorException(error) def vm_reset(self, vmname): """ Resets a virtual machine. If the virtual machine is powered off, then turns the power on for this virtual machine :param vmname: virtual machine name :raise: AttributeError, ExistenceException, Exception """ if not vmname: raise AttributeError("Couldn't specify the virtual machine name") if not self._is_vm_exist(vmname): raise ExistenceException("Couldn't find the virtual machine '%s'" % vmname) try: self._connect_to_esx() vm = self.esx_server.get_vm_by_name(vmname) if not vm.is_powered_off(): vm.reset() else: vm.power_on() except Exception as error: self._disconnect_from_esx() raise CreatorException(error) def get_vm_path(self, vmname): """ Gets a virtual machine path on ESX server :param vmname: virtual machine name :return: virtual machine path :raise: CreatorException """ self._connect_to_esx() try: vm = self.esx_server.get_vm_by_name(vmname) except Exception: raise ExistenceException("Couldn't find the virtual machine '%s'" % vmname) try: return vm.get_property("path") except Exception as error: self._disconnect_from_esx() raise CreatorException(error) pass # todo: REVIEW ME def get_vm_obj(self, vmname): """ Gets a virtual machine object on ESX server :param vmname: virtual machine name :return: VIVirtualMachine instance :raise: CreatorException """ self._connect_to_esx() try: return self.esx_server.get_vm_by_name(vmname) except Exception: raise ExistenceException("Couldn't find the virtual machine '%s'" % vmname) finally: self._disconnect_from_esx() def add_existence_vmdk(self, vm_name, path): """ Add existence hard drive (.vmdk) to the virtual machine :param vm_name: virtual machine name :param path: hard drive path :param space: space for hard drive :raise: ExistenceException, CreatorException """ self._connect_to_esx() try: vm = self.esx_server.get_vm_by_name(vm_name) except Exception: raise ExistenceException("Couldn't find the virtual machine %s" % vm_name) unit_number = -1 for disk in vm._disks: unit_number = max(unit_number, disk["device"]["unitNumber"]) unit_number += 1 request = VI.ReconfigVM_TaskRequestMsg() _this = request.new__this(vm._mor) _this.set_attribute_type(vm._mor.get_attribute_type()) request.set_element__this(_this) spec = request.new_spec() dc = spec.new_deviceChange() dc.Operation = "add" hd = VI.ns0.VirtualDisk_Def("hd").pyclass() hd.Key = -100 hd.UnitNumber = unit_number hd.CapacityInKB = 0 hd.ControllerKey = 1000 backing = VI.ns0.VirtualDiskFlatVer2BackingInfo_Def("backing").pyclass() backing.FileName = path backing.DiskMode = "persistent" backing.ThinProvisioned = False hd.Backing = backing connectable = hd.new_connectable() connectable.StartConnected = True connectable.AllowGuestControl = False connectable.Connected = True hd.Connectable = connectable dc.Device = hd spec.DeviceChange = [dc] request.Spec = spec task = self.esx_server._proxy.ReconfigVM_Task(request)._returnval vi_task = VITask(task, self.esx_server) # Wait for task to finis status = vi_task.wait_for_state([vi_task.STATE_SUCCESS, vi_task.STATE_ERROR]) if status == vi_task.STATE_ERROR: self._disconnect_from_esx() raise CreatorException("ERROR CONFIGURING VM:%s" % vi_task.get_error_message()) # todo: add comment def _get_portgroup_name(self, name, esx_hostname=None): """ Get exist network from ESX :param name: network name :param esx_hostname: ESX host name :return: :raise: """ self._connect_to_esx() hosts = self.esx_server.get_hosts() try: if esx_hostname: host_system = [k for k, v in hosts.items() if v == esx_hostname][0] else: host_system = hosts.keys()[0] except IndexError: raise CreatorException("Couldn't find host") if not host_system: raise CreatorException("Couldn't find host") prop = VIProperty(self.esx_server, host_system) for pg in prop.configManager.networkSystem.networkInfo.portgroup: if pg.spec.name.lower() == name.lower(): real_name = pg.spec.name # self._disconnect_from_esx() return real_name # self._disconnect_from_esx() return None # todo: add comment def _is_vm_exist(self, name): """ :param name: :return: """ self._connect_to_esx() exist = False try: self.esx_server.get_vm_by_name(name) exist = True except: pass # self._disconnect_from_esx() return exist # todo: add comment def _fetch_resource_pool(self, rp_name, esx_hostname): """ :param rp_name: :param esx_hostname: :return: """ rpmor = None if rp_name == "/": rp_mor_temp = [k for k, v in self.esx_server.get_resource_pools().items() if v == "/Resources"] for rp in rp_mor_temp: prop = VIProperty(self.esx_server, rp) if prop.parent.name == esx_hostname: rpmor = rp break else: resource_pool = "/Resources" + rp_name rp_mor_temp = [k for k, v in self.esx_server.get_resource_pools().items() if v == resource_pool] for rp in rp_mor_temp: prop = VIProperty(self.esx_server, rp) while prop.parent.name != "host": prop = prop.parent if prop.name == esx_hostname: rpmor = rp break if rp: break return rpmor # todo: add comment def _fetch_computer_resource(self, datacenter_props, host): """ :param datacenter_props: :param host: :return: """ host_folder = datacenter_props.hostFolder._obj # get computer resources computer_resources = self.esx_server._retrieve_properties_traversal( property_names=["name", "host"], from_node=host_folder, obj_type="ComputeResource" ) # get computer resource of this host crmor = None for cr in computer_resources: if crmor: break for p in cr.PropSet: if p.Name == "host": for h in p.Val.get_element_ManagedObjectReference(): if h == host: crmor = cr.Obj break if crmor: break return VIProperty(self.esx_server, crmor)
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
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
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
def get_host_vm_info(vcsa_host): user = "******" passwd = "xxxxx" server = VIServer() server.connect(vcsa_host, user, passwd) print('\033[32mVC connect successful...\033[0m') host_info = dict() for esx_hostname, esx_ip in server.get_hosts().items(): print(esx_hostname, esx_ip) props = server._retrieve_properties_traversal(property_names=[ 'name', 'summary.overallStatus', 'summary.quickStats.overallMemoryUsage', 'summary.quickStats.overallCpuUsage', 'summary.hardware.memorySize', 'summary.hardware.numCpuCores', 'summary.hardware.numCpuThreads', 'summary.hardware.cpuMhz', 'summary.hardware.otherIdentifyingInfo', 'hardware.biosInfo', 'summary.hardware', 'datastore' ], from_node=esx_hostname, obj_type="HostSystem") try: for prop_set in props: # mor = prop_set.Obj #in case you need it for prop in prop_set.PropSet: if prop.Name == "summary.quickStats.overallMemoryUsage": used_mem = prop.Val elif prop.Name == "summary.quickStats.overallCpuUsage": host_used_cpu = prop.Val elif prop.Name == "summary.hardware.otherIdentifyingInfo": identification_info_list = prop.Val.__dict__[ '_HostSystemIdentificationInfo'] host_sn = identification_info_list[-1].__dict__[ '_identifierValue'] elif prop.Name == "summary.hardware.memorySize": host_info["server_mem"] = prop.Val elif prop.Name == "summary.hardware.numCpuThreads": host_cpu_num = prop.Val elif prop.Name == "summary.hardware.numCpuCores": host_cpucores_num = prop.Val elif prop.Name == "summary.hardware.cpuMhz": mhz_per_core = prop.Val elif prop.Name == "summary.overallStatus": host_status = prop.Val if host_status == "green": host_info["status"] = "running" elif host_status == "gray": host_info["status"] = "down" elif host_status == "yellow": host_info["status"] = "running" elif host_status == "red": host_info["status"] = "error" elif prop.Name == "hardware.biosInfo": time_tuple = prop.Val.__dict__['_releaseDate'] host_info["release_date"] = time.strftime( "%Y-%m-%d", time_tuple) # print HostBiosInfo elif prop.Name == "datastore": datastore_list = prop.Val.__dict__[ '_ManagedObjectReference'] server_disk = dict() disk_all_free = dict() Datastore_All = 0 Datastore_Free = 0 for index, ds in enumerate(datastore_list): DatastoreCapacity = 0 DatastoreFreespace = 0 DatastoreUsagePercent = 0 props_d = server._retrieve_properties_traversal( property_names=[ 'name', 'summary.capacity', 'summary.freeSpace' ], from_node=ds, obj_type="Datastore") for prop_set_d in props_d: for prop_d in prop_set_d.PropSet: if prop_d.Name == "summary.capacity": DatastoreCapacity = (prop_d.Val / 1024 / 1024 / 1024) elif prop_d.Name == "summary.freeSpace": DatastoreFreespace = (prop_d.Val / 1024 / 1024 / 1024) DatastorePreUsagePercent = (( (DatastoreCapacity - DatastoreFreespace) * 100) / DatastoreCapacity) disk_all_free[ds] = [ DatastoreCapacity, DatastoreFreespace, DatastorePreUsagePercent ] Datastore_All = Datastore_All + DatastoreCapacity Datastore_Free = Datastore_Free + DatastoreFreespace DatastoreUsagePercent = (( (Datastore_All - Datastore_Free) * 100) / Datastore_All) server_disk["total"] = Datastore_All server_disk["free"] = Datastore_Free server_disk["used_pct"] = DatastoreUsagePercent server_disk["detail"] = disk_all_free # print server_disk elif prop.Name == "summary.hardware": # print 'hardware----:', prop.Val.__dict__ hardware = prop.Val.__dict__ host_info["product_name"] = hardware['_model'] host_info["uuid"] = hardware['_uuid'] host_info["manufacturer"] = hardware['_vendor'] except Exception as e: # print(prop.Val.__dict__) print(e) continue host_info["vmware_disk"] = server_disk host_info["used_cpu"] = (host_used_cpu * 100) / (host_cpucores_num * mhz_per_core) host_info["server_cpu"] = host_cpu_num host_info["used_mem"] = '%.1f' % ( (used_mem * 1024 * 1024 * 100) / host_info["server_mem"]) host_info["is_vm"] = 0 host_info['sn'] = host_sn host_info["os"] = "VMware ESX" host_info["hostname"] = esx_hostname host_info["nic_mac_ip"] = {esx_hostname: [{esx_hostname: [esx_ip]}]} host_info["check_update_time"] = datetime.datetime.now().strftime( "%Y-%m-%d %H:%M:%S") # host_running_num = len(server.get_registered_vms(esx_hostname, status='poweredOn')) # host_stop_num = len(server.get_registered_vms(esx_hostname, status='poweredOff')) host_info["vm_num"] = len(server.get_registered_vms(esx_hostname)) res['params'] = host_info print(esx_ip, host_info) send(res) # vm host vms_info = dict() properties = [ 'summary.vm', 'summary.config.numEthernetCards', 'summary.config.annotation', 'summary.config.numVirtualDisks', 'summary.quickStats.overallCpuUsage', 'summary.quickStats.guestMemoryUsage', 'summary.quickStats.ftLogBandwidth', 'summary.quickStats.hostMemoryUsage', 'summary.quickStats.uptimeSeconds', 'summary.runtime.powerState', 'summary.runtime.bootTime', 'summary.runtime.host', 'summary.runtime.maxCpuUsage', 'summary.runtime.maxMemoryUsage', 'summary.storage.committed', 'summary.storage.uncommitted', 'summary.storage.unshared', 'summary.storage.timestamp', 'guestHeartbeatStatus', 'guest.toolsStatus', 'guest.toolsVersionStatus', 'guest.toolsVersion', 'guest.guestId', 'guest.guestFullName', 'guest.guestState', 'guest.ipAddress', 'guest.hostName', 'name', 'parent', 'config.template', 'config.hardware.numCPU', 'config.hardware.memoryMB', 'config.uuid' ] # 通过_retrieve_properties_traversal方法传入API接口定义拿到对象类型为 VirtualMachine 的信息 props = server._retrieve_properties_traversal(property_names=properties, obj_type='VirtualMachine') server.disconnect() # 通过server.get_hosts()拿到VC下面所有的host信息(字典); # 通过这个方法可以把'guest.hostName'取出的MOR对象转换成实际的hostname # hostname = server.get_hosts().items() for prop in props: mor = prop.Obj vm = {} for p in prop.PropSet: vm[p.Name] = p.Val vms_info[mor] = vm vms_dict = vms_info.values() vm_info = {} for i in range(len(vms_dict)): vm = vms_dict[i] """ {'config.hardware.numCPU': 2, 'guest.guestId': 'centos64Guest', 'guest.guestFullName': 'CentOS 4/5 or later (64-bit)', 'summary.quickStats.hostMemoryUsage': 3846, 'summary.storage.committed': 68898546142, 'guest.hostName': 'JF-PROD-zk02', 'summary.quickStats.uptimeSeconds': 63854590, 'summary.runtime.maxMemoryUsage': 4096, 'config.uuid': '564d162d-99ee-19a4-9b2d-6721d5e6f9f1', 'guest.ipAddress': '172.20.1.27', 'config.template': False, 'guest.toolsVersionStatus': 'guestToolsCurrent', 'summary.quickStats.ftLogBandwidth': -1, 'summary.config.numEthernetCards': 1, 'summary.storage.uncommitted': 1002, 'config.hardware.memoryMB': 4096, 'summary.runtime.host': 'host-396', 'summary.config.annotation': '', 'parent': 'group-v372', 'summary.quickStats.overallCpuUsage': 66, 'summary.runtime.powerState': 'poweredOn', 'summary.runtime.maxCpuUsage': 4400, 'guest.toolsVersion': '9536', 'guest.guestState': 'running', 'guestHeartbeatStatus': 'green', 'name': 'JF-PROD-zk02', 'summary.storage.timestamp': (2018, 11, 30, 15, 25, 30, 654, 0, 0), 'summary.storage.unshared': 64424509440, 'summary.config.numVirtualDisks': 2, 'summary.quickStats.guestMemoryUsage': 327, 'summary.runtime.bootTime': (2016, 9, 18, 23, 20, 56, 724, 0, 0), 'guest.toolsStatus': 'toolsOk', 'summary.vm': 'vm-401'} """ # vm_info["hostname"] = vm["name"] vm_info["parent_host"] = vm["summary.runtime.host"] vm_info["uuid"] = vm["config.uuid"] vm_info["status"] = vm["guest.guestState"] print(vm_info) res['params'] = vm_info send(res)
#print dc_name 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(' ', '_') #print prefix + dc_name + ".datastores." + gphDSName props = VIProperty(server, ds_mor) lines.append(prefix + dc_name + ".datastores." + props.summary.type + "." + gphDSName + ".capacity " + str(props.summary.capacity) + str(now)) # print 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)) # print 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)) hosts = server.get_hosts(dc_mor) for hs_mor, hs_name in hosts.items(): gphHostName = hs_name.replace('.','_') # print dc_name + "." +hs_name #print prefix + dc_name + ".hosts." + gphHostName props = VIProperty(server, hs_mor) print props counters = pm.get_entity_counters(hs_mor) for counter_name, counter_val in counters.items(): stats = pm.get_entity_statistic(hs_mor, counter_val) if not stats: print "Nothing" for stat in stats: lines.append(prefix + dc_name + ".hosts." + gphHostName + "." + stat.unit_description + "." + stat.counter + " " + str(stat.value) + " " + str(now))
go_on = True if __name__ == "__main__": #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,