⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xendnode.py

📁 xen虚拟机源代码安装包
💻 PY
📖 第 1 页 / 共 2 页
字号:
#============================================================================# This library is free software; you can redistribute it and/or# modify it under the terms of version 2.1 of the GNU Lesser General Public# License as published by the Free Software Foundation.## This library is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU# Lesser General Public License for more details.## You should have received a copy of the GNU Lesser General Public# License along with this library; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA#============================================================================# Copyright (C) 2004, 2005 Mike Wray <mike.wray@hp.com># Copyright (c) 2006, 2007 Xensource Inc.#============================================================================import osimport socketimport xen.lowlevel.xcfrom xen.util import Brctlfrom xen.util import pci as PciUtilfrom xen.xend import XendAPIStorefrom xen.xend import osdepimport uuid, archfrom XendPBD import XendPBDfrom XendError import *from XendOptions import instance as xendoptionsfrom XendQCoWStorageRepo import XendQCoWStorageRepofrom XendLocalStorageRepo import XendLocalStorageRepofrom XendLogging import logfrom XendPIF import *from XendPIFMetrics import XendPIFMetricsfrom XendNetwork import *from XendStateStore import XendStateStorefrom XendMonitor import XendMonitorfrom XendPPCI import XendPPCI     class XendNode:    """XendNode - Represents a Domain 0 Host."""        def __init__(self):        """Initalises the state of all host specific objects such as        * host        * host_CPU        * host_metrics        * PIF        * PIF_metrics        * network        * Storage Repository        * PPCI        """                self.xc = xen.lowlevel.xc.xc()        self.state_store = XendStateStore(xendoptions().get_xend_state_path())        self.monitor = XendMonitor()        self.monitor.start()        # load host state from XML file        saved_host = self.state_store.load_state('host')        if saved_host and len(saved_host.keys()) == 1:            self.uuid = saved_host.keys()[0]            host = saved_host[self.uuid]            self.name = host.get('name_label', socket.gethostname())            self.desc = host.get('name_description', '')            self.host_metrics_uuid = host.get('metrics_uuid',                                              uuid.createString())            try:                self.other_config = eval(host['other_config'])            except:                self.other_config = {}            self.cpus = {}        else:            self.uuid = uuid.createString()            self.name = socket.gethostname()            self.desc = ''            self.other_config = {}            self.cpus = {}            self.host_metrics_uuid = uuid.createString()        # put some arbitrary params in other_config as this        # is directly exposed via XenAPI        self.other_config["xen_pagesize"] = self.xeninfo_dict()["xen_pagesize"]        self.other_config["platform_params"] = self.xeninfo_dict()["platform_params"]                    # load CPU UUIDs        saved_cpus = self.state_store.load_state('cpu')        for cpu_uuid, cpu in saved_cpus.items():            self.cpus[cpu_uuid] = cpu        cpuinfo = osdep.get_cpuinfo()        physinfo = self.physinfo_dict()        cpu_count = physinfo['nr_cpus']        cpu_features = physinfo['hw_caps']        virt_caps = physinfo['virt_caps']        # If the number of CPUs don't match, we should just reinitialise         # the CPU UUIDs.        if cpu_count != len(self.cpus):            self.cpus = {}            for i in range(cpu_count):                u = uuid.createString()                self.cpus[u] = {'uuid': u, 'number': i }        for u in self.cpus.keys():            number = self.cpus[u]['number']            # We can run off the end of the cpuinfo list if domain0 does not            # have #vcpus == #pcpus. In that case we just replicate one that's            # in the hash table.            if not cpuinfo.has_key(number):                number = cpuinfo.keys()[0]            if arch.type == "x86":                self.cpus[u].update(                    { 'host'     : self.uuid,                      'features' : cpu_features,                      'virt_caps': virt_caps,                      'speed'    : int(float(cpuinfo[number]['cpu MHz'])),                      'vendor'   : cpuinfo[number]['vendor_id'],                      'modelname': cpuinfo[number]['model name'],                      'stepping' : cpuinfo[number]['stepping'],                      'flags'    : cpuinfo[number]['flags'],                    })            elif arch.type == "ia64":                self.cpus[u].update(                    { 'host'     : self.uuid,                      'features' : cpu_features,                      'speed'    : int(float(cpuinfo[number]['cpu MHz'])),                      'vendor'   : cpuinfo[number]['vendor'],                      'modelname': cpuinfo[number]['family'],                      'stepping' : cpuinfo[number]['model'],                      'flags'    : cpuinfo[number]['features'],                    })            else:                self.cpus[u].update(                    { 'host'     : self.uuid,                      'features' : cpu_features,                    })        self.srs = {}        # Initialise networks        # First configure ones off disk        saved_networks = self.state_store.load_state('network')        if saved_networks:            for net_uuid, network in saved_networks.items():                try:                    XendNetwork.recreate(network, net_uuid)                except CreateUnspecifiedAttributeError:                    log.warn("Error recreating network %s", net_uuid)                        # Next discover any existing bridges and check        # they are not already configured        bridges = Brctl.get_state().keys()        configured_bridges = [XendAPIStore.get(                                  network_uuid, "network")                                      .get_name_label()                              for network_uuid in XendNetwork.get_all()]        unconfigured_bridges = [bridge                                for bridge in bridges                                if bridge not in configured_bridges]        for unconfigured_bridge in unconfigured_bridges:            XendNetwork.create_phy(unconfigured_bridge)        # Initialise PIFs        # First configure ones off disk        saved_pifs = self.state_store.load_state('pif')        if saved_pifs:            for pif_uuid, pif in saved_pifs.items():                try:                    XendPIF.recreate(pif, pif_uuid)                except CreateUnspecifiedAttributeError:                    log.warn("Error recreating PIF %s", pif_uuid)                # Next discover any existing PIFs and check        # they are not already configured        configured_pifs = [XendAPIStore.get(                               pif_uuid, "PIF")                                   .get_interface_name()                           for pif_uuid in XendPIF.get_all()]        unconfigured_pifs = [(name, mtu, mac)                             for name, mtu, mac in linux_get_phy_ifaces()                             if name not in configured_pifs]        # Get a mapping from interface to bridge                  if_to_br = dict([(i,b)                         for (b,ifs) in Brctl.get_state().items()                             for i in ifs])        for name, mtu, mac in unconfigured_pifs:            # Check PIF is on bridge            # if not, ignore            bridge_name = if_to_br.get(name, None)            if bridge_name is not None:                # Translate bridge name to network uuid                for network_uuid in XendNetwork.get_all():                    network = XendAPIStore.get(                        network_uuid, 'network')                    if network.get_name_label() == bridge_name:                        XendPIF.create_phy(network_uuid, name,                                           mac, mtu)                        break                else:                    log.debug("Cannot find network for bridge %s "                              "when configuring PIF %s",                              (bridge_name, name))                     # initialise storage        saved_srs = self.state_store.load_state('sr')        if saved_srs:            for sr_uuid, sr_cfg in saved_srs.items():                if sr_cfg['type'] == 'qcow_file':                    self.srs[sr_uuid] = XendQCoWStorageRepo(sr_uuid)                elif sr_cfg['type'] == 'local':                    self.srs[sr_uuid] = XendLocalStorageRepo(sr_uuid)        # Create missing SRs if they don't exist        if not self.get_sr_by_type('local'):            image_sr_uuid = uuid.createString()            self.srs[image_sr_uuid] = XendLocalStorageRepo(image_sr_uuid)                    if not self.get_sr_by_type('qcow_file'):            qcow_sr_uuid = uuid.createString()            self.srs[qcow_sr_uuid] = XendQCoWStorageRepo(qcow_sr_uuid)        saved_pbds = self.state_store.load_state('pbd')        if saved_pbds:            for pbd_uuid, pbd_cfg in saved_pbds.items():                try:                    XendPBD.recreate(pbd_uuid, pbd_cfg)                except CreateUnspecifiedAttributeError:                    log.warn("Error recreating PBD %s", pbd_uuid)         # Initialise PPCIs        saved_ppcis = self.state_store.load_state('ppci')        saved_ppci_table = {}        if saved_ppcis:            for ppci_uuid, ppci_record in saved_ppcis.items():                try:                    saved_ppci_table[ppci_record['name']] = ppci_uuid                except KeyError:                    pass        for pci_dev in PciUtil.get_all_pci_devices():            ppci_record = {                'domain':                   pci_dev.domain,                'bus':                      pci_dev.bus,                'slot':                     pci_dev.slot,                'func':                     pci_dev.func,                'vendor_id':                pci_dev.vendor,                'vendor_name':              pci_dev.vendorname,                'device_id':                pci_dev.device,                'device_name':              pci_dev.devicename,                'revision_id':              pci_dev.revision,                'class_code':               pci_dev.classcode,                'class_name':               pci_dev.classname,                'subsystem_vendor_id':      pci_dev.subvendor,                'subsystem_vendor_name':    pci_dev.subvendorname,                'subsystem_id':             pci_dev.subdevice,                'subsystem_name':           pci_dev.subdevicename,                'driver':                   pci_dev.driver                }            # If saved uuid exists, use it. Otherwise create one.            ppci_uuid = saved_ppci_table.get(pci_dev.name, uuid.createString())            XendPPCI(ppci_uuid, ppci_record)##    def network_destroy(self, net_uuid): ##       del self.networks[net_uuid]  ##      self.save_networks()    def get_PIF_refs(self):        log.debug(XendPIF.get_all())        return XendPIF.get_all()##   def _PIF_create(self, name, mtu, vlan, mac, network, persist = True,##                     pif_uuid = None, metrics_uuid = None):##         for pif in self.pifs.values():##             if pif.network == network:##                 raise NetworkAlreadyConnected(pif.uuid)##         if pif_uuid is None:##             pif_uuid = uuid.createString()##         if metrics_uuid is None:##             metrics_uuid = uuid.createString()##         metrics = XendPIFMetrics(metrics_uuid)##         pif = XendPIF(pif_uuid, metrics, name, mtu, vlan, mac, network, self)##         metrics.set_PIF(pif)##         self.pif_metrics[metrics_uuid] = metrics##         self.pifs[pif_uuid] = pif##         if persist:##             self.save_PIFs()##             self.refreshBridges()##         return pif_uuid##     def PIF_destroy(self, pif_uuid):##         pif = self.pifs[pif_uuid]##         if pif.vlan == -1:##             raise PIFIsPhysical()##         del self.pifs[pif_uuid]##         self.save_PIFs()    def get_PPCI_refs(self):        return XendPPCI.get_all()    def get_ppci_by_uuid(self, ppci_uuid):        if ppci_uuid in self.get_PPCI_refs():            return ppci_uuid        return None    def save(self):        # save state        host_record = {self.uuid: {'name_label':self.name,                                   'name_description':self.desc,                                   'metrics_uuid': self.host_metrics_uuid,                                   'other_config': self.other_config}}        self.state_store.save_state('host',host_record)        self.state_store.save_state('cpu', self.cpus)        self.save_PIFs()        self.save_networks()        self.save_PBDs()        self.save_SRs()        self.save_PPCIs()    def save_PIFs(self):        pif_records = dict([(pif_uuid, XendAPIStore.get(                                 pif_uuid, "PIF").get_record())                            for pif_uuid in XendPIF.get_all()])        self.state_store.save_state('pif', pif_records)    def save_networks(self):        net_records = dict([(network_uuid, XendAPIStore.get(                                 network_uuid, "network").get_record())                            for network_uuid in XendNetwork.get_all()])        self.state_store.save_state('network', net_records)    def save_PBDs(self):        pbd_records = dict([(pbd_uuid, XendAPIStore.get(                                 pbd_uuid, "PBD").get_record())                            for pbd_uuid in XendPBD.get_all()])        self.state_store.save_state('pbd', pbd_records)    def save_SRs(self):        sr_records = dict([(k, v.get_record(transient = False))                            for k, v in self.srs.items()])        self.state_store.save_state('sr', sr_records)    def save_PPCIs(self):        ppci_records = dict([(ppci_uuid, XendAPIStore.get(                                 ppci_uuid, "PPCI").get_record())                            for ppci_uuid in XendPPCI.get_all()])        self.state_store.save_state('ppci', ppci_records)    def shutdown(self):        return 0    def reboot(self):        return 0    def notify(self, _):        return 0            #    # Ref validation    #    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -