aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/python/xen/xend/XendDomainInfo.py18
-rw-r--r--tools/python/xen/xend/server/XMLRPCServer.py2
-rw-r--r--tools/python/xen/xm/main.py11
3 files changed, 20 insertions, 11 deletions
diff --git a/tools/python/xen/xend/XendDomainInfo.py b/tools/python/xen/xend/XendDomainInfo.py
index 9ef0993c35..20009b0760 100644
--- a/tools/python/xen/xend/XendDomainInfo.py
+++ b/tools/python/xen/xend/XendDomainInfo.py
@@ -602,16 +602,16 @@ class XendDomainInfo:
mac = x[1]
break
break
- dev_info = self.getDeviceInfo_vif(mac)
+ dev_info = self._getDeviceInfo_vif(mac)
else:
_, dev_info = sxprs[dev]
else: # 'vbd' or 'tap'
- dev_info = self.getDeviceInfo_vbd(dev)
+ dev_info = self._getDeviceInfo_vbd(dev)
# To remove the UUID of the device from refs,
# deviceClass must be always 'vbd'.
deviceClass = 'vbd'
if dev_info is None:
- return rc
+ raise XendError("Device %s is not defined" % devid)
dev_uuid = sxp.child_value(dev_info, 'uuid')
del self.info['devices'][dev_uuid]
@@ -632,14 +632,22 @@ class XendDomainInfo:
dev_num += 1
return sxprs
- def getDeviceInfo_vif(self, mac):
+ def getBlockDeviceClass(self, devid):
+ # To get a device number from the devid,
+ # we temporarily use the device controller of VBD.
+ dev = self.getDeviceController('vbd').convertToDeviceNumber(devid)
+ dev_info = self._getDeviceInfo_vbd(dev)
+ if dev_info:
+ return dev_info[0]
+
+ def _getDeviceInfo_vif(self, mac):
for dev_type, dev_info in self.info.all_devices_sxpr():
if dev_type != 'vif':
continue
if mac == sxp.child_value(dev_info, 'mac'):
return dev_info
- def getDeviceInfo_vbd(self, devid):
+ def _getDeviceInfo_vbd(self, devid):
for dev_type, dev_info in self.info.all_devices_sxpr():
if dev_type != 'vbd' and dev_type != 'tap':
continue
diff --git a/tools/python/xen/xend/server/XMLRPCServer.py b/tools/python/xen/xend/server/XMLRPCServer.py
index 81a799b185..91eb21632d 100644
--- a/tools/python/xen/xend/server/XMLRPCServer.py
+++ b/tools/python/xen/xend/server/XMLRPCServer.py
@@ -87,7 +87,7 @@ methods = ['device_create', 'device_configure',
'destroyDevice','getDeviceSxprs',
'setMemoryTarget', 'setName', 'setVCpuCount', 'shutdown',
'send_sysrq', 'getVCPUInfo', 'waitForDevices',
- 'getRestartCount']
+ 'getRestartCount', 'getBlockDeviceClass']
exclude = ['domain_create', 'domain_restore']
diff --git a/tools/python/xen/xm/main.py b/tools/python/xen/xm/main.py
index 3f83e65d05..8473f8bf5b 100644
--- a/tools/python/xen/xm/main.py
+++ b/tools/python/xen/xm/main.py
@@ -2217,12 +2217,13 @@ def xm_block_detach(args):
% (dev,dom))
else:
arg_check(args, 'block-detach', 2, 3)
- try:
+ dom = args[0]
+ dev = args[1]
+ dc = server.xend.domain.getBlockDeviceClass(dom, dev)
+ if dc == "tap":
+ detach(args, 'tap')
+ else:
detach(args, 'vbd')
- return
- except:
- pass
- detach(args, 'tap')
def xm_network_detach(args):
if serverType == SERVER_XEN_API: