[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [XEND] Add missing Xen API methods
# HG changeset patch # User Alastair Tse <atse@xxxxxxxxxxxxx> # Date 1169648721 0 # Node ID bea3d48576c66663e559fbba1bcd9f840a3d1b25 # Parent 6a54b1d8d1053c4facfef8c3c1da871950a5b29c [XEND] Add missing Xen API methods * Added session.get_all, task.get_by_name_label, host.get_by_name_label, VM.add_to_otherConfig, VM.remove_from_otherConfig * Added implementations for VM.get_VCPUs_policy, VM.get_platform_std_vga, VM.get_vm_by_uuid, VM.get_platform_localtime, VM.get_platform_clock_offset, VM.get_platform_enable_audio, VM.get_platform_keymap, VM.get_otherConfig, VM.set_actions_after_shutdown, VM.set_actions_after_reboot, VM.set_actions_after_suspend, VM.set_actions_after_crash, VM.set_platform_std_VGA, VM.set_platform_serial, VM.set_platform_keymap, VM.set_platform_localtime, VM.set_platform_clock_offset, VM.set_platform_enable_audio, VM.set_otherConfig, VBD.destroy, VBD.get_io_read_kbs, VBD.get_io_write_kbs, VBD.get_all, VIF.destroy, VIF.get_VM, VIF.get_name, VIF.get_MTU, VIF.get_MAC, VIF.get_type, VIF.get_device, VIF.get_io_read_kbs, VIF.get_io_write_kbs, VIF.get_all, VTPM.destroy, VTPM.get_all * Save devid of a device on creation in XendDomainInfo Signed-off-by: Alastair Tse <atse@xxxxxxxxxxxxx> --- tools/python/xen/xend/XendAPI.py | 217 +++++++++++++++++++++++--------- tools/python/xen/xend/XendConfig.py | 2 tools/python/xen/xend/XendDomainInfo.py | 41 +++++- 3 files changed, 198 insertions(+), 62 deletions(-) diff -r 6a54b1d8d105 -r bea3d48576c6 tools/python/xen/xend/XendAPI.py --- a/tools/python/xen/xend/XendAPI.py Wed Jan 24 13:58:06 2007 +0000 +++ b/tools/python/xen/xend/XendAPI.py Wed Jan 24 14:25:21 2007 +0000 @@ -329,7 +329,6 @@ class XendAPI: return xen_api_error(['SESSION_AUTHENTICATION_FAILED']) session_login_with_password.api = 'session.login_with_password' - # object methods def session_logout(self, session): auth_manager().logout(session) @@ -340,7 +339,9 @@ class XendAPI: record = {'this_host': XendNode.instance().uuid, 'this_user': auth_manager().get_user(session)} return xen_api_success(record) - + def session_get_all(self): + return xen_api_error(XEND_ERROR_UNSUPPORTED) + # attributes (ro) def session_get_this_host(self, session): return xen_api_success(XendNode.instance().uuid) @@ -428,6 +429,9 @@ class XendAPI: def task_get_record(self, session, task_ref): task = XendTaskManager.get_task(task_ref) return xen_api_success(task.get_record()) + + def task_get_by_name_label(self, session, name): + return xen_api_success(XendTaskManager.get_task_by_name(name)) # Xen API: Class Host # ---------------------------------------------------------------- @@ -497,6 +501,11 @@ class XendAPI: return xen_api_success((XendNode.instance().uuid,)) def host_create(self, session, struct): return xen_api_error(XEND_ERROR_UNSUPPORTED) + def host_get_by_name_label(self, session, name): + if XendNode.instance().name == name: + return xen_api_success((XendNode.instance().uuid,)) + return xen_api_success([]) + # Xen API: Class Host_CPU # ---------------------------------------------------------------- @@ -507,9 +516,6 @@ class XendAPI: 'utilisation'] # attributes - def host_cpu_get_uuid(self, session, host_cpu_ref): - uuid = XendNode.instance().get_host_cpu_uuid(host_cpu_ref) - return xen_api_success(uuid) def host_cpu_get_host(self, session, host_cpu_ref): return xen_api_success(XendNode.instance().uuid) def host_cpu_get_features(self, session, host_cpu_ref): @@ -749,7 +755,9 @@ class XendAPI: ('hard_shutdown', None), ('hard_reboot', None), ('suspend', None), - ('resume', None)] + ('resume', None), + ('add_to_otherConfig', None), + ('remove_from_otherConfig', None)] VM_funcs = [('create', 'VM'), ('get_by_name_label', 'Set(VM)')] @@ -884,7 +892,7 @@ class XendAPI: def VM_get_VCPUs_policy(self, session, vm_ref): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() # need to access scheduler + return dom.get_vcpus_policy() def VM_get_VCPUs_params(self, session, vm_ref): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) @@ -908,7 +916,7 @@ class XendAPI: def VM_get_actions_after_suspend(self, session, vm_ref): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success(dom.get_on_suspend()) + return xen_api_success(dom.get_on_suspend()) def VM_get_actions_after_crash(self, session, vm_ref): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) @@ -934,31 +942,30 @@ class XendAPI: def VM_get_platform_std_VGA(self, session, vm_ref): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() + return xen_api_success(dom.get_platform_std_vga()) def VM_get_platform_serial(self, session, vm_ref): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() + return xen_api_success(dom.get_platform_serial()) def VM_get_platform_localtime(self, session, vm_ref): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() + return xen_api_success(dom.get_platform_localtime()) def VM_get_platform_clock_offset(self, session, vm_ref): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() + return xen_api_success(dom.get_platform_clock_offset()) def VM_get_platform_enable_audio(self, session, vm_ref): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() + return xen_api_success(dom.get_platform_enable_audio()) def VM_get_platform_keymap(self, session, vm_ref): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() + return xen_api_success(dom.get_platform_keymap()) def VM_get_otherConfig(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() + return self.VM_get('otherConfig', session, vm_ref) def VM_set_name_label(self, session, vm_ref, label): dom = XendDomain.instance().get_vm_by_uuid(vm_ref) @@ -1002,20 +1009,24 @@ class XendAPI: return xen_api_todo() def VM_set_actions_after_shutdown(self, session, vm_ref, action): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() + if action not in XEN_API_ON_NORMAL_EXIST: + return xen_api_error(['VM_ON_NORMAL_EXIT_INVALID', vm_ref]) + return self.VM_set('actions_after_shutdown', session, vm_ref, action) def VM_set_actions_after_reboot(self, session, vm_ref, action): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() + if action not in XEN_API_ON_NORMAL_EXIST: + return xen_api_error(['VM_ON_NORMAL_EXIT_INVALID', vm_ref]) + return self.VM_set('actions_after_reboot', session, vm_ref, action) def VM_set_actions_after_suspend(self, session, vm_ref, action): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() + if action not in XEN_API_ON_NORMAL_EXIT: + return xen_api_error(['VM_ON_NORMAL_EXIT_INVALID', vm_ref]) + return self.VM_set('actions_after_suspend', session, vm_ref, action) def VM_set_actions_after_crash(self, session, vm_ref, action): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_success_void() + if action not in XEN_API_ON_CRASH_BEHAVIOUR: + return xen_api_error(['VM_ON_CRASH_BEHAVIOUR_INVALID', vm_ref]) + return self.VM_set('actions_after_crash', session, vm_ref, action) def VM_set_HVM_boot(self, session, vm_ref, value): return self.VM_set('HVM_boot', session, vm_ref, value) @@ -1035,29 +1046,39 @@ class XendAPI: def VM_set_PV_bootloader_args(self, session, vm_ref, value): return self.VM_set('PV_bootloader_args', session, vm_ref, value) - def VM_set_platform_std_VGA(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() - - def VM_set_platform_serial(self, session, vm_ref, serial): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() - - def VM_set_platform_localtime(self, session, vm_ref, localtime): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() - - def VM_set_platform_clock_offset(self, session, vm_ref, clock_offset): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() - - def VM_set_platform_enable_audio(self, session, vm_ref, enable_audio): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() - - def VM_set_otherConfig(self, session, vm_ref): - dom = XendDomain.instance().get_vm_by_uuid(vm_ref) - return xen_api_todo() + def VM_set_platform_std_VGA(self, session, vm_ref, value): + return self.VM_set('platform_std_vga', session, vm_ref, value) + + def VM_set_platform_serial(self, session, vm_ref, value): + return self.VM_set('platform_serial', session, vm_ref, value) + + def VM_set_platform_keymap(self, session, vm_ref, value): + return self.VM_set('platform_keymap', session, vm_ref, value) + + def VM_set_platform_localtime(self, session, vm_ref, value): + return self.VM_set('platform_localtime', session, vm_ref, value) + + def VM_set_platform_clock_offset(self, session, vm_ref, value): + return self.VM_set('platform_clock_offset', session, vm_ref, value) + + def VM_set_platform_enable_audio(self, session, vm_ref, value): + return self.VM_set('platform_enable_audio', session, vm_ref, value) + + def VM_set_otherConfig(self, session, vm_ref, value): + return self.VM_set('otherconfig', session, vm_ref, value) + + def VM_add_to_otherConfig(self, session, vm_ref, key, value): + dom = XendDomain.instance().get_vm_by_uuid(vm_ref) + if dom and 'otherconfig' in dom.info: + dom.info['otherconfig'][key] = value + return xen_api_success_void() + + def VM_remove_from_otherConfig(self, session, vm_ref, key): + dom = XendDomain.instance().get_vm_by_uuid(vm_ref) + if dom and 'otherconfig' in dom.info \ + and key in dom.info['otherconfig']: + del dom.info['otherconfig'][key] + return xen_api_success_void() # class methods def VM_get_all(self, session): @@ -1128,7 +1149,7 @@ class XendAPI: 'platform_keymap': xeninfo.get_platform_keymap(), 'PCI_bus': xeninfo.get_pci_bus(), 'tools_version': xeninfo.get_tools_version(), - 'otherConfig': xeninfo.get_other_config() + 'otherConfig': xeninfo.info.get('otherconfig'), } return xen_api_success(record) @@ -1181,8 +1202,6 @@ class XendAPI: # Xen API: Class VBD # ---------------------------------------------------------------- - # Note: accepts a non-API standard 'image' attribute to emulate - # regular xm created VBDs VBD_attr_ro = ['image', 'io_read_kbs', @@ -1249,6 +1268,16 @@ class XendAPI: xendom.managed_config_save(dom) return xen_api_success(vbd_ref) + + def VBD_destroy(self, session, vbd_ref): + xendom = XendDomain.instance() + vm = xendom.get_vm_with_dev_uuid('vbd', vbd_ref) + if not vm: + return xen_api_error(['VBD_HANDLE_INVALID', vbd_ref]) + + vm.destroy_vbd(vbd_ref) + return xen_api_success_void() + # attributes (rw) def VBD_get_VM(self, session, vbd_ref): xendom = XendDomain.instance() @@ -1277,6 +1306,18 @@ class XendAPI: xendom = XendDomain.instance() return xen_api_success(xendom.get_dev_property_by_uuid('vbd', vbd_ref, 'type')) + + def VBD_get_io_read_kbs(self, session, vbd_ref): + return xen_api_todo() + + def VBD_get_io_write_kbs(self, session, vbd_ref): + return xen_api_todo() + + def VBD_get_all(self, session): + xendom = XendDomain.instance() + vbds = [d.get_vbds() for d in XendDomain.instance().list('all')] + vbds = reduce(lambda x, y: x + y, vbds) + return xen_api_success(vbds) # Xen API: Class VIF # ---------------------------------------------------------------- @@ -1331,6 +1372,59 @@ class XendAPI: return xen_api_error(['VM_HANDLE_INVALID', vif_struct['VM']]) + def VIF_destroy(self, session, vif_ref): + xendom = XendDomain.instance() + vm = xendom.get_vm_with_dev_uuid('vif', vif_ref) + if not vm: + return xen_api_error(['VIF_HANDLE_INVALID', vif_ref]) + + vm.destroy_vif(vif_ref) + return xen_api_success_void() + + # getters/setters + def VIF_get_VM(self, session, vif_ref): + xendom = XendDomain.instance() + vm = xendom.get_vm_with_dev_uuid('vif', vif_ref) + return xen_api_success(vm.get_uuid()) + + def VIF_get_name(self, session, vif_ref): + xendom = XendDomain.instance() + return xen_api_success(xendom.get_dev_property_by_uuid('vif', vif_ref, + 'name')) + def VIF_get_MTU(self, session, vif_ref): + xendom = XendDomain.instance() + return xen_api_success(xendom.get_dev_property_by_uuid('vif', vif_ref, + 'MTU')) + def VIF_get_MAC(self, session, vif_ref): + xendom = XendDomain.instance() + return xen_api_success(xendom.get_dev_property_by_uuid('vif', vif_ref, + 'MAC')) + + def VIF_get_type(self, session, vif_ref): + xendom = XendDomain.instance() + return xen_api_success(xendom.get_dev_property_by_uuid('vif', vif_ref, + 'type')) + + + def VIF_get_device(self, session, vif_ref): + xendom = XendDomain.instance() + return xen_api_success(xendom.get_dev_property_by_uuid('vif', vif_ref, + 'device')) + + + def VIF_get_io_read_kbs(self, session, vif_ref): + return xen_api_todo() + + def VIF_get_io_write_kbs(self, session, vif_ref): + return xen_api_todo() + + def VIF_get_all(self, session): + xendom = XendDomain.instance() + vifs = [d.get_vifs() for d in XendDomain.instance().list('all')] + vifs = reduce(lambda x, y: x + y, vifs) + return xen_api_success(vifs) + + # Xen API: Class VDI # ---------------------------------------------------------------- VDI_attr_ro = ['VBDs', @@ -1445,9 +1539,10 @@ class XendAPI: # Class Functions def VDI_create(self, session, vdi_struct): sr = XendNode.instance().get_sr() - sr_ref = vdi_struct['SR'] + sr_ref = vdi_struct.get('SR') + if sr.uuid != sr_ref: - return xen_api_error(['SR_HANDLE_INVALID', vdi_struct['SR']]) + return xen_api_error(['SR_HANDLE_INVALID', vdi_struct.get('SR')]) vdi_uuid = sr.create_image(vdi_struct) return xen_api_success(vdi_uuid) @@ -1542,6 +1637,15 @@ class XendAPI: return xen_api_success(xendom.get_dev_property_by_uuid('vtpm', vtpm_ref, 'VM')) + def VTPM_destroy(self, session, vtpm_ref): + xendom = XendDomain.instance() + vm = xendom.get_vm_with_dev_uuid('vtpm', vtpm_ref) + if not vm: + return xen_api_error(['VTPM_HANDLE_INVALID', vtpm_ref]) + + vm.destroy_vtpm(vtpm_ref) + return xen_api_success_void() + # class methods def VTPM_create(self, session, vtpm_struct): xendom = XendDomain.instance() @@ -1556,6 +1660,12 @@ class XendAPI: else: return xen_api_error(['VM_HANDLE_INVALID', vtpm_struct['VM']]) + def VTPM_get_all(self, session): + xendom = XendDomain.instance() + vtpms = [d.get_vtpms() for d in XendDomain.instance().list('all')] + vtpms = reduce(lambda x, y: x + y, vtpms) + return xen_api_success(vtpms) + # Xen API: Class SR # ---------------------------------------------------------------- @@ -1592,9 +1702,6 @@ class XendAPI: def SR_create(self, session): return xen_api_error(XEND_ERROR_UNSUPPORTED) - - def SR_get_by_uuid(self, session): - return xen_api_success(XendNode.instance().get_sr().uuid) # Class Methods def SR_clone(self, session, sr_ref): diff -r 6a54b1d8d105 -r bea3d48576c6 tools/python/xen/xend/XendConfig.py --- a/tools/python/xen/xend/XendConfig.py Wed Jan 24 13:58:06 2007 +0000 +++ b/tools/python/xen/xend/XendConfig.py Wed Jan 24 14:25:21 2007 +0000 @@ -984,6 +984,8 @@ class XendConfig(dict): # dev_info['vifname'] = cfg_xenapi.get('device') if cfg_xenapi.get('type'): dev_info['type'] = cfg_xenapi.get('type') + if cfg_xenapi.get('name'): + dev_info['name'] = cfg_xenapi.get('name') dev_uuid = cfg_xenapi.get('uuid', uuid.createString()) dev_info['uuid'] = dev_uuid diff -r 6a54b1d8d105 -r bea3d48576c6 tools/python/xen/xend/XendDomainInfo.py --- a/tools/python/xen/xend/XendDomainInfo.py Wed Jan 24 13:58:06 2007 +0000 +++ b/tools/python/xen/xend/XendDomainInfo.py Wed Jan 24 14:25:21 2007 +0000 @@ -548,8 +548,6 @@ class XendDomainInfo: return self.getDeviceController(deviceClass).destroyDevice(devid, force) - - def getDeviceSxprs(self, deviceClass): if self.state == DOM_STATE_RUNNING: return self.getDeviceController(deviceClass).sxprs() @@ -1221,7 +1219,12 @@ class XendDomainInfo: for (devclass, config) in self.info.get('devices', {}).values(): if devclass in XendDevices.valid_devices(): log.info("createDevice: %s : %s" % (devclass, scrub_password(config))) - self._createDevice(devclass, config) + dev_uuid = config.get('uuid') + devid = self._createDevice(devclass, config) + + # store devid in XendConfig for caching reasons + if dev_uuid in self.info['devices']: + self.info['devices'][dev_uuid][1]['devid'] = devid if self.image: self.image.createDeviceModel() @@ -1951,11 +1954,9 @@ class XendDomainInfo: def get_platform_keymap(self): return self.info.get('platform_keymap', '') def get_pci_bus(self): - return '' # TODO + return self.info.get('pci_bus', '') def get_tools_version(self): - return {} # TODO - def get_other_config(self): - return {} # TODO + return self.info.get('tools_version', {}) def get_on_shutdown(self): after_shutdown = self.info.get('action_after_shutdown') @@ -2203,6 +2204,32 @@ class XendDomainInfo: return dev_uuid + def destroy_device_by_uuid(self, dev_type, dev_uuid): + if dev_uuid not in self.info['devices']: + raise XendError('Device does not exist') + + try: + if self.state == XEN_API_VM_POWER_STATE_RUNNING: + _, config = self.info['devices'][dev_uuid] + devid = config.get('devid') + if devid != None: + self.getDeviceController(dev_type).destroyDevice(devid, force = False) + else: + raise XendError('Unable to get devid for device: %s:%s' % + (dev_type, dev_uuid)) + finally: + del self.info['devices'][dev_uuid] + self.info['%s_refs' % dev_type].remove(dev_uuid) + + def destroy_vbd(self, dev_uuid): + self.destroy_device_by_uuid('vbd', dev_uuid) + + def destroy_vif(self, dev_uuid): + self.destroy_device_by_uuid('vif', dev_uuid) + + def destroy_vtpm(self, dev_uuid): + self.destroy_device_by_uuid('vtpm', dev_uuid) + def has_device(self, dev_class, dev_uuid): return (dev_uuid in self.info['%s_refs' % dev_class.lower()]) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |