[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] Fix xm scsi-attach/detach/list for inactive managed domains
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1225101797 0 # Node ID 5c48ab6b1977b7f03033f150ef36b54c759d4df7 # Parent 874d0d673ecb55749cdc836942222ba684b365cb Fix xm scsi-attach/detach/list for inactive managed domains Signed-off-by: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx> --- tools/python/xen/util/diagnose.py | 4 - tools/python/xen/xend/XendConfig.py | 17 +++--- tools/python/xen/xend/XendDomainInfo.py | 73 ++++++++++++++++++-------- tools/python/xen/xend/server/DevConstants.py | 45 ++++++++++++++++ tools/python/xen/xend/server/DevController.py | 29 ---------- tools/python/xen/xend/server/pciif.py | 3 - tools/python/xen/xend/server/vscsiif.py | 15 ++--- tools/python/xen/xm/create.py | 5 + tools/python/xen/xm/main.py | 5 + 9 files changed, 126 insertions(+), 70 deletions(-) diff -r 874d0d673ecb -r 5c48ab6b1977 tools/python/xen/util/diagnose.py --- a/tools/python/xen/util/diagnose.py Thu Oct 23 15:38:52 2008 +0100 +++ b/tools/python/xen/util/diagnose.py Mon Oct 27 10:03:17 2008 +0000 @@ -23,7 +23,7 @@ from xen.xend.XendClient import server from xen.xend.XendClient import server from xen.xend.XendError import XendError from xen.xend.xenstore.xstransact import xstransact -from xen.xend.server import DevController +from xen.xend.server import DevConstants import xen.xend.XendProtocol @@ -169,7 +169,7 @@ def diagnose_hotplugging(): def stateString(state): - return state and DevController.xenbusState[int(state)] or '<None>' + return state and DevConstants.xenbusState[int(state)] or '<None>' def main(argv = None): diff -r 874d0d673ecb -r 5c48ab6b1977 tools/python/xen/xend/XendConfig.py --- a/tools/python/xen/xend/XendConfig.py Thu Oct 23 15:38:52 2008 +0100 +++ b/tools/python/xen/xend/XendConfig.py Mon Oct 27 10:03:17 2008 +0000 @@ -1602,21 +1602,21 @@ class XendConfig(dict): # [vscsi, # [dev, # [devid, 0], [p-devname, sdb], [p-dev, 1:0:0:1], - # [v-dev, 0:0:0:0], [state, Initialising] + # [v-dev, 0:0:0:0], [state, 1] # ], # [dev, # [devid, 0], [p-devname, sdc], [p-dev, 1:0:0:2], - # [v-dev, 0:0:0:1], [satet, Initialising] + # [v-dev, 0:0:0:1], [satet, 1] # ] # ], # [vscsi, # [dev, # [devid, 1], [p-devname, sdg], [p-dev, 2:0:0:0], - # [v-dev, 1:0:0:0], [state, Initialising] + # [v-dev, 1:0:0:0], [state, 1] # ], # [dev, # [devid, 1], [p-devname, sdh], [p-dev, 2:0:0:1], - # [v-dev, 1:0:0:1], [satet, Initialising] + # [v-dev, 1:0:0:1], [satet, 1] # ] # ] # ] @@ -1632,18 +1632,19 @@ class XendConfig(dict): # [vscsi, # [dev, # [devid, 0], [p-devname, sdd], [p-dev, 1:0:0:3], - # [v-dev, 0:0:0:2], [state, Initialising] + # [v-dev, 0:0:0:2], [state, 1] # ] # ] # ] # - # state 'Initialising' indicates that the device is being attached, - # while state 'Closing' indicates that the device is being detached. + # state xenbusState['Initialising'] indicates that the device is + # being attached, while state xenbusState['Closing'] indicates + # that the device is being detached. # # The Dict looks like this: # # { devs: [ {devid: 0, p-devname: sdd, p-dev: 1:0:0:3, - # v-dev: 0:0:0:2, state: Initialising} ] } + # v-dev: 0:0:0:2, state: 1} ] } dev_config = {} diff -r 874d0d673ecb -r 5c48ab6b1977 tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Thu Oct 23 15:38:52 2008 +0100 +++ b/tools/python/xen/xend/XendDomainInfo.py Mon Oct 27 10:03:17 2008 +0000 @@ -52,6 +52,7 @@ from xen.xend.xenstore.xswatch import xs from xen.xend.xenstore.xswatch import xswatch from xen.xend.XendConstants import * from xen.xend.XendAPIConstants import * +from xen.xend.server.DevConstants import xenbusState from xen.xend.XendVMMetrics import XendVMMetrics @@ -797,7 +798,7 @@ class XendDomainInfo: existing_dev_info = self._getDeviceInfo_vscsi(req_devid, dev['v-dev']) state = dev['state'] - if state == 'Initialising': + if state == xenbusState['Initialising']: # new create # If request devid does not exist, create and exit. if existing_dev_info is None: @@ -806,25 +807,48 @@ class XendDomainInfo: elif existing_dev_info == "exists": raise XendError("The virtual device %s is already defined" % dev['v-dev']) - elif state == 'Closing': + elif state == xenbusState['Closing']: if existing_dev_info is None: raise XendError("Cannot detach vscsi device does not exist") - # use DevController.reconfigureDevice to change device config - dev_control = self.getDeviceController(dev_class) - dev_uuid = dev_control.reconfigureDevice(req_devid, dev_config) - dev_control.waitForDevice_reconfigure(req_devid) - num_devs = dev_control.cleanupDevice(req_devid) - - # update XendConfig with new device info - if dev_uuid: - new_dev_sxp = dev_control.configuration(req_devid) + if self.domid is not None: + # use DevController.reconfigureDevice to change device config + dev_control = self.getDeviceController(dev_class) + dev_uuid = dev_control.reconfigureDevice(req_devid, dev_config) + dev_control.waitForDevice_reconfigure(req_devid) + num_devs = dev_control.cleanupDevice(req_devid) + + # update XendConfig with new device info + if dev_uuid: + new_dev_sxp = dev_control.configuration(req_devid) + self.info.device_update(dev_uuid, new_dev_sxp) + + # If there is no device left, destroy vscsi and remove config. + if num_devs == 0: + self.destroyDevice('vscsi', req_devid) + del self.info['devices'][dev_uuid] + + else: + cur_dev_sxp = self._getDeviceInfo_vscsi(req_devid, None) + new_dev_sxp = ['vscsi'] + for cur_dev in sxp.children(cur_dev_sxp, 'dev'): + if state == xenbusState['Closing']: + cur_dev_vdev = sxp.child_value(cur_dev, 'v-dev') + if cur_dev_vdev == dev['v-dev']: + continue + new_dev_sxp.append(cur_dev) + + if state == xenbusState['Initialising']: + new_dev_sxp.append(sxp.child0(dev_sxp, 'dev')) + + dev_uuid = sxp.child_value(cur_dev_sxp, 'uuid') self.info.device_update(dev_uuid, new_dev_sxp) - # If there is no device left, destroy vscsi and remove config. - if num_devs == 0: - self.destroyDevice('vscsi', req_devid) - del self.info['devices'][dev_uuid] + # If there is only 'vscsi' in new_dev_sxp, remove the config. + if len(sxp.children(new_dev_sxp, 'dev')) == 0: + del self.info['devices'][dev_uuid] + + xen.xend.XendDomain.instance().managed_config_save(self) return True @@ -986,7 +1010,17 @@ class XendDomainInfo: sxprs = [] dev_num = 0 for dev_type, dev_info in self.info.all_devices_sxpr(): - if dev_type == deviceClass: + if dev_type != deviceClass: + continue + + if deviceClass == 'vscsi': + vscsi_devs = ['devs', []] + for vscsi_dev in sxp.children(dev_info, 'dev'): + vscsi_dev.append(['frontstate', None]) + vscsi_devs[1].append(vscsi_dev) + dev_num = int(sxp.child_value(vscsi_dev, 'devid')) + sxprs.append([dev_num, [vscsi_devs]]) + else: sxprs.append([dev_num, dev_info]) dev_num += 1 return sxprs @@ -2380,11 +2414,10 @@ class XendDomainInfo: time.sleep(2) for paths in plist: if paths.find('backend') != -1: - from xen.xend.server import DevController # Modify online status /before/ updating state (latter is watched by # drivers, so this ordering avoids a race). xstransact.Write(paths, 'online', "0") - xstransact.Write(paths, 'state', str(DevController.xenbusState['Closing'])) + xstransact.Write(paths, 'state', str(xenbusState['Closing'])) # force xstransact.Remove(paths) @@ -3439,7 +3472,7 @@ class XendDomainInfo: ['p-devname', pscsi.get_dev_name()], ['p-dev', pscsi.get_physical_HCTL()], ['v-dev', xenapi_dscsi.get('virtual_HCTL')], - ['state', 'Initialising'], + ['state', xenbusState['Initialising']], ['uuid', dscsi_uuid] ] ] @@ -3558,7 +3591,7 @@ class XendDomainInfo: if target_dev is None: raise XendError('Failed to destroy device') - target_dev.append(['state', 'Closing']) + target_dev.append(['state', xenbusState['Closing']]) target_vscsi_sxp = ['vscsi', target_dev] if self._stateGet() != XEN_API_VM_POWER_STATE_RUNNING: diff -r 874d0d673ecb -r 5c48ab6b1977 tools/python/xen/xend/server/DevConstants.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tools/python/xen/xend/server/DevConstants.py Mon Oct 27 10:03:17 2008 +0000 @@ -0,0 +1,45 @@ +#============================================================================ +# 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@xxxxxx> +# Copyright (C) 2005 XenSource Ltd +#============================================================================ + +DEVICE_CREATE_TIMEOUT = 100 +DEVICE_DESTROY_TIMEOUT = 100 +HOTPLUG_STATUS_NODE = "hotplug-status" +HOTPLUG_ERROR_NODE = "hotplug-error" +HOTPLUG_STATUS_ERROR = "error" +HOTPLUG_STATUS_BUSY = "busy" + +Connected = 1 +Error = 2 +Missing = 3 +Timeout = 4 +Busy = 5 +Disconnected = 6 + +xenbusState = { + 'Unknown' : 0, + 'Initialising' : 1, + 'InitWait' : 2, + 'Initialised' : 3, + 'Connected' : 4, + 'Closing' : 5, + 'Closed' : 6, + 'Reconfiguring' : 7, + 'Reconfigured' : 8, + } +xenbusState.update(dict(zip(xenbusState.values(), xenbusState.keys()))) + diff -r 874d0d673ecb -r 5c48ab6b1977 tools/python/xen/xend/server/DevController.py --- a/tools/python/xen/xend/server/DevController.py Thu Oct 23 15:38:52 2008 +0100 +++ b/tools/python/xen/xend/server/DevController.py Mon Oct 27 10:03:17 2008 +0000 @@ -23,41 +23,14 @@ from xen.xend.XendError import VmError from xen.xend.XendError import VmError from xen.xend.XendLogging import log import xen.xend.XendConfig +from xen.xend.server.DevConstants import * from xen.xend.xenstore.xstransact import xstransact, complete from xen.xend.xenstore.xswatch import xswatch import os -DEVICE_CREATE_TIMEOUT = 100 -DEVICE_DESTROY_TIMEOUT = 100 -HOTPLUG_STATUS_NODE = "hotplug-status" -HOTPLUG_ERROR_NODE = "hotplug-error" -HOTPLUG_STATUS_ERROR = "error" -HOTPLUG_STATUS_BUSY = "busy" - -Connected = 1 -Error = 2 -Missing = 3 -Timeout = 4 -Busy = 5 -Disconnected = 6 - -xenbusState = { - 'Unknown' : 0, - 'Initialising' : 1, - 'InitWait' : 2, - 'Initialised' : 3, - 'Connected' : 4, - 'Closing' : 5, - 'Closed' : 6, - 'Reconfiguring': 7, - 'Reconfigured' : 8, - } - xoptions = XendOptions.instance() - -xenbusState.update(dict(zip(xenbusState.values(), xenbusState.keys()))) class DevController: diff -r 874d0d673ecb -r 5c48ab6b1977 tools/python/xen/xend/server/pciif.py --- a/tools/python/xen/xend/server/pciif.py Thu Oct 23 15:38:52 2008 +0100 +++ b/tools/python/xen/xend/server/pciif.py Mon Oct 27 10:03:17 2008 +0000 @@ -25,7 +25,8 @@ from xen.xend.XendError import VmError from xen.xend.XendError import VmError from xen.xend.XendLogging import log -from xen.xend.server.DevController import DevController, xenbusState +from xen.xend.server.DevController import DevController +from xen.xend.server.DevConstants import xenbusState import xen.lowlevel.xc diff -r 874d0d673ecb -r 5c48ab6b1977 tools/python/xen/xend/server/vscsiif.py --- a/tools/python/xen/xend/server/vscsiif.py Thu Oct 23 15:38:52 2008 +0100 +++ b/tools/python/xen/xend/server/vscsiif.py Mon Oct 27 10:03:17 2008 +0000 @@ -28,7 +28,8 @@ from xen.xend.XendError import VmError from xen.xend.XendError import VmError from xen.xend.XendLogging import log -from xen.xend.server.DevController import DevController, xenbusState +from xen.xend.server.DevController import DevController +from xen.xend.server.DevConstants import xenbusState from xen.xend.xenstore.xstransact import xstransact class VSCSIController(DevController): @@ -92,8 +93,8 @@ class VSCSIController(DevController): 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]) + state = vscsi_config.get('state', xenbusState['Unknown']) + back[devpath + '/state'] = str(state) devid = vscsi_config.get('devid', '') back[devpath + '/devid'] = str(devid) @@ -168,17 +169,17 @@ class VSCSIController(DevController): (devid, back, front) = self.getDeviceDetails(config) devid = int(devid) vscsi_config = config['devs'][0] - state = vscsi_config.get('state', '') + state = vscsi_config.get('state', xenbusState['Unknown']) 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 state == 'Initialising': + if state == xenbusState['Initialising']: back['uuid'] = uuid self.writeBackend(devid, back) - elif state == 'Closing': + elif state == xenbusState['Closing']: found = False devs = self.readBackendList(devid, "vscsi-devs") vscsipath = "vscsi-devs/" @@ -198,7 +199,7 @@ class VSCSIController(DevController): else: raise XendError("Error configuring device invalid " - "state '%s'" % state) + "state '%s'" % xenbusState[state]) self.writeBackend(devid, 'state', str(xenbusState['Reconfiguring'])) return self.readBackend(devid, 'uuid') diff -r 874d0d673ecb -r 5c48ab6b1977 tools/python/xen/xm/create.py --- a/tools/python/xen/xm/create.py Thu Oct 23 15:38:52 2008 +0100 +++ b/tools/python/xen/xm/create.py Mon Oct 27 10:03:17 2008 +0000 @@ -32,6 +32,7 @@ from xen.xend import osdep from xen.xend import osdep import xen.xend.XendClient from xen.xend.XendBootloader import bootloader +from xen.xend.server.DevConstants import xenbusState from xen.util import blkif from xen.util import vscsi_util import xen.util.xsm.xsm as security @@ -707,7 +708,7 @@ def configure_vscsis(config_devs, vals): vscsi_util.vscsi_get_hctl_and_devname_by(p_dev, scsi_devices) if p_hctl == None: - raise ValueError("Cannot find device \"%s\"" % p_dev) + raise ValueError('Cannot find device "%s"' % p_dev) for config in config_scsi: dev = vscsi_convert_sxp_to_dict(config) @@ -717,7 +718,7 @@ def configure_vscsis(config_devs, vals): v_hctl = v_dev.split(':') devid = int(v_hctl[0]) config_scsi.append(['dev', \ - ['state', 'Initialising'], \ + ['state', xenbusState['Initialising']], \ ['devid', devid], \ ['p-dev', p_hctl], \ ['p-devname', devname], \ diff -r 874d0d673ecb -r 5c48ab6b1977 tools/python/xen/xm/main.py --- a/tools/python/xen/xm/main.py Thu Oct 23 15:38:52 2008 +0100 +++ b/tools/python/xen/xm/main.py Mon Oct 27 10:03:17 2008 +0000 @@ -47,6 +47,7 @@ from xen.xend import sxp from xen.xend import sxp from xen.xend import XendClient from xen.xend.XendConstants import * +from xen.xend.server.DevConstants import xenbusState from xen.xm.opts import OptionError, Opts, wrap, set_true from xen.xm import console @@ -2515,7 +2516,7 @@ def xm_scsi_attach(args): dom = args[0] p_scsi = args[1] v_hctl = args[2] - scsi = parse_scsi_configuration(p_scsi, v_hctl, 'Initialising') + scsi = parse_scsi_configuration(p_scsi, v_hctl, xenbusState['Initialising']) if serverType == SERVER_XEN_API: @@ -2635,7 +2636,7 @@ def xm_scsi_detach(args): arg_check(args, 'scsi-detach', 2) dom = args[0] v_hctl = args[1] - scsi = parse_scsi_configuration(None, v_hctl, 'Closing') + scsi = parse_scsi_configuration(None, v_hctl, xenbusState['Closing']) if serverType == SERVER_XEN_API: _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |