[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] xend: Implement VBD.media_change



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1255680293 -3600
# Node ID 0705efd9c69e2e254c85bc4381166b7f9cfb8ee3
# Parent  38a20d76cdec60c5fa3e4480d487d5ae6181843c
xend: Implement VBD.media_change

Signed-off-by: Masaki Kanno <kanno.masaki@xxxxxxxxxxxxxx>
---
 tools/python/xen/xend/XendAPI.py        |   40 ++++++++++++++++++++++++++++++--
 tools/python/xen/xend/XendDomainInfo.py |   31 ++++++++++++++++++++++++
 2 files changed, 69 insertions(+), 2 deletions(-)

diff -r 38a20d76cdec -r 0705efd9c69e tools/python/xen/xend/XendAPI.py
--- a/tools/python/xen/xend/XendAPI.py  Fri Oct 16 08:36:22 2009 +0100
+++ b/tools/python/xen/xend/XendAPI.py  Fri Oct 16 09:04:53 2009 +0100
@@ -1960,8 +1960,44 @@ class XendAPI(object):
 
         return xen_api_success(return_cfg)
 
-    def VBD_media_change(self, session, vbd_ref, vdi_ref):
-        return xen_api_error(XEND_ERROR_UNSUPPORTED)
+    def VBD_media_change(self, session, vbd_ref, new_vdi_ref):
+        xendom = XendDomain.instance()
+        xennode = XendNode.instance()
+
+        vm = xendom.get_vm_with_dev_uuid('vbd', vbd_ref)
+        if not vm:
+            return xen_api_error(['HANDLE_INVALID', 'VBD', vbd_ref])
+        cur_vbd_struct = vm.get_dev_xenapi_config('vbd', vbd_ref)
+        if not cur_vbd_struct:
+            return xen_api_error(['HANDLE_INVALID', 'VBD', vbd_ref])
+        if cur_vbd_struct['type'] != XEN_API_VBD_TYPE[0]:   # Not CD
+            return xen_api_error(['HANDLE_INVALID', 'VBD', vbd_ref])
+        if cur_vbd_struct['mode'] != 'RO':   # Not read only
+            return xen_api_error(['HANDLE_INVALID', 'VBD', vbd_ref])
+
+        new_vdi = xennode.get_vdi_by_uuid(new_vdi_ref)
+        if not new_vdi:
+            return xen_api_error(['HANDLE_INVALID', 'VDI', new_vdi_ref])
+        new_vdi_image = new_vdi.get_location()
+
+        valid_vbd_keys = self.VBD_attr_ro + self.VBD_attr_rw + \
+                         self.Base_attr_ro + self.Base_attr_rw
+
+        new_vbd_struct = {}
+        for k in cur_vbd_struct.keys():
+            if k in valid_vbd_keys:
+                new_vbd_struct[k] = cur_vbd_struct[k]
+        new_vbd_struct['VDI'] = new_vdi_ref
+
+        try:
+            XendTask.log_progress(0, 100,
+                                  vm.change_vdi_of_vbd,
+                                  new_vbd_struct, new_vdi_image)
+        except XendError, e:
+            log.exception("Error in VBD_media_change")
+            return xen_api_error(['INTERNAL_ERROR', str(e)]) 
+
+        return xen_api_success_void()
 
     # class methods
     def VBD_create(self, session, vbd_struct):
diff -r 38a20d76cdec -r 0705efd9c69e tools/python/xen/xend/XendDomainInfo.py
--- a/tools/python/xen/xend/XendDomainInfo.py   Fri Oct 16 08:36:22 2009 +0100
+++ b/tools/python/xen/xend/XendDomainInfo.py   Fri Oct 16 09:04:53 2009 +0100
@@ -3970,6 +3970,37 @@ class XendDomainInfo:
         return dscsi_uuid
 
 
+    def change_vdi_of_vbd(self, xenapi_vbd, vdi_image_path):
+        """Change current VDI with the new VDI.
+
+        @param xenapi_vbd: vbd struct from the Xen API
+        @param vdi_image_path: path of VDI
+        """
+        dev_uuid = xenapi_vbd['uuid']
+        if dev_uuid not in self.info['devices']:
+            raise XendError('Device does not exist')
+
+        # Convert xenapi to sxp
+        if vdi_image_path.startswith('tap'):
+            dev_class = 'tap'
+        else:
+            dev_class = 'vbd'
+        dev_sxp = [
+            dev_class,
+            ['uuid',  dev_uuid],
+            ['uname', vdi_image_path],
+            ['dev',   '%s:cdrom' % xenapi_vbd['device']],
+            ['mode',  'r'],
+            ['VDI',   xenapi_vbd['VDI']]
+        ]
+
+        if self._stateGet() in (XEN_API_VM_POWER_STATE_RUNNING,
+                                XEN_API_VM_POWER_STATE_PAUSED):
+            self.device_configure(dev_sxp)
+        else:
+            self.info.device_update(dev_uuid, dev_sxp)
+
+
     def destroy_device_by_uuid(self, dev_type, dev_uuid):
         if dev_uuid not in self.info['devices']:
             raise XendError('Device does not exist')

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.