diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/python/xen/xend/XendDomainInfo.py | 18 | ||||
-rw-r--r-- | tools/python/xen/xend/server/XMLRPCServer.py | 2 | ||||
-rw-r--r-- | tools/python/xen/xm/main.py | 11 |
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: |