📄 xendnode.py
字号:
def is_valid_host(self, host_ref): return (host_ref == self.uuid) def is_valid_cpu(self, cpu_ref): return (cpu_ref in self.cpus) def is_valid_sr(self, sr_ref): return (sr_ref in self.srs) def is_valid_vdi(self, vdi_ref): for sr in self.srs.values(): if sr.is_valid_vdi(vdi_ref): return True return False # # Storage Repositories # def get_sr(self, sr_uuid): return self.srs.get(sr_uuid) def get_sr_by_type(self, sr_type): return [sr.uuid for sr in self.srs.values() if sr.type == sr_type] def get_sr_by_name(self, name): return [sr.uuid for sr in self.srs.values() if sr.name_label == name] def get_all_sr_uuid(self): return self.srs.keys() def get_vdi_by_uuid(self, vdi_uuid): for sr in self.srs.values(): if sr.is_valid_vdi(vdi_uuid): return sr.get_vdi_by_uuid(vdi_uuid) return None def get_vdi_by_name_label(self, name): for sr in self.srs.values(): vdi = sr.get_vdi_by_name_label(name) if vdi: return vdi return None def get_sr_containing_vdi(self, vdi_uuid): for sr in self.srs.values(): if sr.is_valid_vdi(vdi_uuid): return sr return None # # Host Functions # def xen_version(self): info = self.xc.xeninfo() info = {'Xen': '%(xen_major)d.%(xen_minor)d' % info} # Add xend_config_format info.update(self.xendinfo_dict()) # Add version info about machine info.update(self.nodeinfo_dict()) # Add specific xen version info xeninfo_dict = self.xeninfo_dict() info.update({ "xen_major": xeninfo_dict["xen_major"], "xen_minor": xeninfo_dict["xen_minor"], "xen_extra": xeninfo_dict["xen_extra"], "cc_compiler": xeninfo_dict["cc_compiler"], "cc_compile_by": xeninfo_dict["cc_compile_by"], "cc_compile_domain": xeninfo_dict["cc_compile_domain"], "cc_compile_date": xeninfo_dict["cc_compile_date"], "xen_changeset": xeninfo_dict["xen_changeset"] }) return info def get_name(self): return self.name def set_name(self, new_name): self.name = new_name def get_description(self): return self.desc def set_description(self, new_desc): self.desc = new_desc def get_uuid(self): return self.uuid def get_capabilities(self): return self.xc.xeninfo()['xen_caps'].split(" ") # # Host CPU Functions # def get_host_cpu_by_uuid(self, host_cpu_uuid): if host_cpu_uuid in self.cpus: return host_cpu_uuid raise XendError('Invalid CPU UUID') def get_host_cpu_refs(self): return self.cpus.keys() def get_host_cpu_uuid(self, host_cpu_ref): if host_cpu_ref in self.cpus: return host_cpu_ref else: raise XendError('Invalid CPU Reference') def get_host_cpu_field(self, ref, field): try: return self.cpus[ref][field] except KeyError: raise XendError('Invalid CPU Reference') def get_host_cpu_load(self, host_cpu_ref): host_cpu = self.cpus.get(host_cpu_ref) if not host_cpu: return 0.0 vcpu = int(host_cpu['number']) cpu_loads = self.monitor.get_domain_vcpus_util() if 0 in cpu_loads and vcpu in cpu_loads[0]: return cpu_loads[0][vcpu] return 0.0 def get_vcpus_policy(self): sched_id = self.xc.sched_id_get() if sched_id == xen.lowlevel.xc.XEN_SCHEDULER_SEDF: return 'sedf' elif sched_id == xen.lowlevel.xc.XEN_SCHEDULER_CREDIT: return 'credit' else: return 'unknown' def get_cpu_configuration(self): phys_info = self.physinfo_dict() cpu_info = { "nr_nodes": phys_info["nr_nodes"], "nr_cpus": phys_info["nr_cpus"], "cores_per_socket": phys_info["cores_per_socket"], "threads_per_core": phys_info["threads_per_core"] } return cpu_info # # Network Functions # def bridge_to_network(self, bridge): """ Determine which network a particular bridge is attached to. @param bridge The name of the bridge. If empty, the default bridge will be used instead (the first one in the list returned by brctl show); this is the behaviour of the vif-bridge script. @return The XendNetwork instance to which this bridge is attached. @raise Exception if the interface is not connected to a network. """ if not bridge: rc, bridge = commands.getstatusoutput( 'brctl show | cut -d "\n" -f 2 | cut -f 1') if rc != 0 or not bridge: raise Exception( 'Could not find default bridge, and none was specified') for network_uuid in XendNetwork.get_all(): network = XendAPIStore.get(network_uuid, "network") if network.get_name_label() == bridge: return network else: raise Exception('Cannot find network for bridge %s' % bridge) # # Debug keys. # def send_debug_keys(self, keys): return self.xc.send_debug_keys(keys) # # Getting host information. # def info(self): return (self.nodeinfo() + self.physinfo() + self.xeninfo() + self.xendinfo()) def nodeinfo(self): (sys, host, rel, ver, mch) = os.uname() return [['system', sys], ['host', host], ['release', rel], ['version', ver], ['machine', mch]] def list_to_rangepairs(self,cmap): cmap.sort() pairs = [] x = y = 0 for i in range(0,len(cmap)): try: if ((cmap[y+1] - cmap[i]) > 1): pairs.append((cmap[x],cmap[y])) x = y = i+1 else: y = y + 1 # if we go off the end, then just add x to y except IndexError: pairs.append((cmap[x],cmap[y])) return pairs def format_pairs(self,pairs): if not pairs: return "no cpus" out = "" for f,s in pairs: if (f==s): out += '%d'%f else: out += '%d-%d'%(f,s) out += ',' # trim trailing ',' return out[:-1] def list_to_strrange(self,list): return self.format_pairs(self.list_to_rangepairs(list)) def format_node_to_cpu(self, pinfo): str='' whitespace='' try: node_to_cpu=pinfo['node_to_cpu'] for i in range(0, pinfo['nr_nodes']): str+='%snode%d:%s\n' % (whitespace, i, self.list_to_strrange(node_to_cpu[i])) whitespace='%25s' % '' except: str='none\n' return str[:-1]; def format_node_to_memory(self, pinfo): str='' whitespace='' try: node_to_memory=pinfo['node_to_memory'] for i in range(0, pinfo['nr_nodes']): str+='%snode%d:%d\n' % (whitespace, i, node_to_memory[i] / 1024) whitespace='%25s' % '' except: str='none\n' return str[:-1]; def physinfo(self): info = self.xc.physinfo() info['cpu_mhz'] = info['cpu_khz'] / 1000 # physinfo is in KiB, need it in MiB info['total_memory'] = info['total_memory'] / 1024 info['free_memory'] = info['free_memory'] / 1024 info['node_to_cpu'] = self.format_node_to_cpu(info) info['node_to_memory'] = self.format_node_to_memory(info) ITEM_ORDER = ['nr_cpus', 'nr_nodes', 'cores_per_socket', 'threads_per_core', 'cpu_mhz', 'hw_caps', 'virt_caps', 'total_memory', 'free_memory', 'node_to_cpu', 'node_to_memory' ] return [[k, info[k]] for k in ITEM_ORDER] def xenschedinfo(self): sched_id = self.xc.sched_id_get() if sched_id == xen.lowlevel.xc.XEN_SCHEDULER_SEDF: return 'sedf' elif sched_id == xen.lowlevel.xc.XEN_SCHEDULER_CREDIT: return 'credit' else: return 'unknown' def xeninfo(self): info = self.xc.xeninfo() info['xen_scheduler'] = self.xenschedinfo() ITEM_ORDER = ['xen_major', 'xen_minor', 'xen_extra', 'xen_caps', 'xen_scheduler', 'xen_pagesize', 'platform_params', 'xen_changeset', 'cc_compiler', 'cc_compile_by', 'cc_compile_domain', 'cc_compile_date', ] return [[k, info[k]] for k in ITEM_ORDER] def xendinfo(self): return [['xend_config_format', 4]] # # utilisation tracking # def get_vcpu_util(self, domid, vcpuid): cpu_loads = self.monitor.get_domain_vcpus_util() if domid in cpu_loads: return cpu_loads[domid].get(vcpuid, 0.0) return 0.0 def get_vif_util(self, domid, vifid): vif_loads = self.monitor.get_domain_vifs_util() if domid in vif_loads: return vif_loads[domid].get(vifid, (0.0, 0.0)) return (0.0, 0.0) def get_vif_stat(self, domid, vifid): vif_loads = self.monitor.get_domain_vifs_stat() if domid in vif_loads: return vif_loads[domid].get(vifid, (0.0, 0.0)) return (0.0, 0.0) def get_vbd_util(self, domid, vbdid): vbd_loads = self.monitor.get_domain_vbds_util() if domid in vbd_loads: return vbd_loads[domid].get(vbdid, (0.0, 0.0)) return (0.0, 0.0) # dictionary version of *info() functions to get rid of # SXPisms. def nodeinfo_dict(self): return dict(self.nodeinfo()) def xendinfo_dict(self): return dict(self.xendinfo()) def xeninfo_dict(self): return dict(self.xeninfo()) def physinfo_dict(self): return dict(self.physinfo()) def info_dict(self): return dict(self.info())def instance(): global inst try: inst except: inst = XendNode() inst.save() return inst
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -