vscsiif.py

来自「xen虚拟机源代码安装包」· Python 代码 · 共 233 行

PY
233
字号
#============================================================================# 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) 2007 FUJITSU Limited#                     Based on the blkif.py#============================================================================"""Support for VSCSI Devices."""import reimport stringimport typesfrom xen.xend import sxpfrom xen.xend.XendError import VmErrorfrom xen.xend.XendLogging import logfrom xen.xend.server.DevController import DevController, xenbusStatefrom xen.xend.xenstore.xstransact import xstransactclass VSCSIController(DevController):    """VSCSI Devices.    """    def __init__(self, vm):        """Create a VSCSI Devices.        """        DevController.__init__(self, vm)    def sxprs(self):        """@see DevController.sxprs"""        devslist = []        for devid in self.deviceIDs():            vscsi_devs = self.readBackendList(devid, "vscsi-devs")            vscsipath = "vscsi-devs/"            devs = []            vscsi_config = []            for dev in vscsi_devs:                devpath = vscsipath + dev                backstate = self.readBackend(devid, devpath + '/state')                pdev = self.readBackend(devid, devpath + '/p-dev')                pdevname = self.readBackend(devid, devpath + '/p-devname')                vdev = self.readBackend(devid, devpath + '/v-dev')                localdevid = self.readBackend(devid, devpath + '/devid')                frontstate = self.readFrontend(devid, devpath + '/state')                devs.append(['dev', \                                    ['state', backstate], \                                    ['devid', localdevid], \                                    ['p-dev', pdev], \                                    ['p-devname', pdevname], \                                    ['v-dev', vdev], \                                    ['frontstate', frontstate] ])            vscsi_config.append(['devs', devs])            state = self.readFrontend(devid, 'state')            vscsi_config.append(['state', state])            backid = self.readFrontend(devid, 'backend-id')            vscsi_config.append(['backend-id', backid])            backpath = self.readFrontend(devid, 'backend')            vscsi_config.append(['backend', backpath])            devslist.append([devid, vscsi_config])        return devslist    def getDeviceDetails(self, config):        """@see DevController.getDeviceDetails"""        back = {}        vscsipath = "vscsi-devs/"        for vscsi_config in config.get('devs', []):            localdevid = self.allocateDeviceID()            # vscsi-devs/dev-0            devpath = vscsipath + 'dev-%i' % localdevid            back[devpath] = ""            pdev = vscsi_config.get('p-dev', '')            back[devpath + '/p-dev'] = pdev            pdevname = vscsi_config.get('p-devname', '')            back[devpath + '/p-devname'] = pdevname            vdev = vscsi_config.get('v-dev', '')            back[devpath + '/v-dev'] = vdev            state = vscsi_config.get('state', '')            back[devpath + '/state'] = str(xenbusState[state])            devid = vscsi_config.get('devid', '')            back[devpath + '/devid'] = str(devid)        back['uuid'] = config.get('uuid','')        devid = int(devid)        return (devid, back, {})    def readBackendList(self, devid, *args):        frontpath = self.frontendPath(devid)        backpath = xstransact.Read(frontpath + "/backend")        if backpath:            paths = map(lambda x: backpath + "/" + x, args)            return xstransact.List(*paths)    def getDeviceConfiguration(self, devid, transaction = None):        config = DevController.getDeviceConfiguration(self, devid, transaction)        vscsi_devs = []        devs = self.readBackendList(devid, "vscsi-devs")        vscsipath = "vscsi-devs/"        for dev in devs:            devpath = vscsipath + dev            pdev = self.readBackend(devid, devpath + '/p-dev')            pdevname = self.readBackend(devid, devpath + '/p-devname')            vdev = self.readBackend(devid, devpath + '/v-dev')            state = self.readBackend(devid, devpath + '/state')            localdevid = self.readBackend(devid, devpath + '/devid')            dev_dict = {'p-dev': pdev,                            'p-devname': pdevname,                            'v-dev': pdevname,                            'state': state,                            'devid': localdevid }            vscsi_devs.append(dev_dict)        config['devs'] = vscsi_devs        config['uuid'] = self.readBackend(devid, 'uuid')        return config    def configuration(self, devid, transaction = None):        """Returns SXPR for devices on domain.        @note: we treat this dict especially to convert to        SXP because it is not a straight dict of strings."""                configDict = self.getDeviceConfiguration(devid, transaction)        sxpr = [self.deviceClass]        # remove devs        devs = configDict.pop('devs', [])                for dev in devs:            dev_sxpr = ['dev']            for dev_item in dev.items():                dev_sxpr.append(list(dev_item))            sxpr.append(dev_sxpr)                for key, val in configDict.items():            if type(val) == type(list()):                for v in val:                    sxpr.append([key, v])            else:                sxpr.append([key, val])        return sxpr    def reconfigureDevice(self, _, config):        """@see DevController.reconfigureDevice"""        (devid, back, front) = self.getDeviceDetails(config)        devid = int(devid)        vscsi_config = config['devs'][0]        states = config.get('states', [])        driver_state = self.readBackend(devid, 'state')        if str(xenbusState['Connected']) != driver_state:            raise VmError("Driver status is not connected")        uuid = self.readBackend(devid, 'uuid')        if states[0] == 'Initialising':            back['uuid'] = uuid            self.writeBackend(devid, back)        elif states[0] == 'Closing':            found = False            devs = self.readBackendList(devid, "vscsi-devs")            vscsipath = "vscsi-devs/"            vdev = vscsi_config.get('v-dev', '')            for dev in devs:                devpath = vscsipath + dev                old_vdev = self.readBackend(devid, devpath + '/v-dev')                if vdev == old_vdev:                    found = True                    self.writeBackend(devid, devpath + '/state', \                                    str(xenbusState['Closing']))                    break            if not found:                raise VmError("Device %s not connected" % vdev)        else:            raise XendError('Error configuring device invalid state %s'                                % state)        self.writeBackend(devid, 'state', str(xenbusState['Reconfiguring']))        return self.readBackend(devid, 'uuid')    def cleanupDevice(self, devid):        devs = self.readBackendList(devid, "vscsi-devs")        vscsipath = "vscsi-devs/"        new_num_devs = 0                for dev in devs:            new_num_devs = new_num_devs + 1            devpath = vscsipath + dev            devstate = self.readBackend(devid, devpath + '/state')            if str(xenbusState['Closed']) == devstate:                self.removeBackend(devid, devpath)                frontpath = self.frontendPath(devid)                xstransact.Remove(frontpath + '/' + devpath)                new_num_devs = new_num_devs - 1            frontpath = self.frontendPath(devid)            front_devstate = xstransact.Read(frontpath + '/' + devpath)            if front_devstate is not None:                if str(xenbusState['Closed']) == front_devstate:                    self.removeBackend(devid, devpath)                    xstransact.Remove(frontpath + '/' + devpath)                    new_num_devs = new_num_devs - 1        return new_num_devs

⌨️ 快捷键说明

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