[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [XEND] Remove autoplug class signatures, have it all handled in the class now
# HG changeset patch # User Tom Wilkie <tom.wilkie@xxxxxxxxx> # Date 1177514181 -3600 # Node ID 31f6f85778e5b8c8612e1712886cdef566284e1f # Parent 7317e701f3e7e4d19a0076acb2accef5a8b6e504 [XEND] Remove autoplug class signatures, have it all handled in the class now signed-off-by: Tom Wilkie <tom.wilkie@xxxxxxxxx> --- tools/python/xen/xend/XendAPI.py | 343 +++++++++------------------------------ 1 files changed, 80 insertions(+), 263 deletions(-) diff -r 7317e701f3e7 -r 31f6f85778e5 tools/python/xen/xend/XendAPI.py --- a/tools/python/xen/xend/XendAPI.py Wed Apr 25 16:14:20 2007 +0100 +++ b/tools/python/xen/xend/XendAPI.py Wed Apr 25 16:16:21 2007 +0100 @@ -27,7 +27,7 @@ import xmlrpclib import xmlrpclib import XendDomain, XendDomainInfo, XendNode, XendDmesg -import XendLogging, XendTaskManager +import XendLogging, XendTaskManager, XendAPIStore from XendAPIVersion import * from XendAuthSessions import instance as auth_manager @@ -38,8 +38,8 @@ from XendTask import XendTask from XendTask import XendTask from XendPIFMetrics import XendPIFMetrics from XendVMMetrics import XendVMMetrics - -import XendPBD +from XendPIF import XendPIF +from XendPBD import XendPBD from XendAPIConstants import * from xen.util.xmlrpclib2 import stringify @@ -237,6 +237,8 @@ def catch_typeerror(func): finally: del tb raise + except XendAPIError, exn: + return xen_api_error(exn.get_api_error()) return f @@ -307,26 +309,6 @@ def valid_vm(func): _check_ref(XendDomain.instance().is_valid_vm, 'VM', func, *args, **kwargs) -def valid_vm_metrics(func): - """Decorator to verify if vm_metrics_ref is valid before calling method. - - @param func: function with params: (self, session, vm_metrics_ref, ...) - @rtype: callable object - """ - return lambda *args, **kwargs: \ - _check_ref(XendVMMetrics.is_valid_vm_metrics, - 'VM_metrics', func, *args, **kwargs) - -def valid_network(func): - """Decorator to verify if network_ref is valid before calling method. - - @param func: function with params: (self, session, network_ref, ...) - @rtype: callable object - """ - return lambda *args, **kwargs: \ - _check_ref(XendNode.instance().is_valid_network, - 'network', func, *args, **kwargs) - def valid_vbd(func): """Decorator to verify if vbd_ref is valid before calling method. @@ -409,39 +391,6 @@ def valid_sr(func): _check_ref(lambda r: XendNode.instance().is_valid_sr, 'SR', func, *args, **kwargs) -def valid_pbd(func): - """Decorator to verify if pbd_ref is valid before calling - method. - - @param func: function with params: (self, session, pbd_ref) - @rtype: callable object - """ - return lambda *args, **kwargs: \ - _check_ref(lambda r: r in XendPBD.get_all_refs(), - 'PBD', func, *args, **kwargs) - -def valid_pif(func): - """Decorator to verify if pif_ref is valid before calling - method. - - @param func: function with params: (self, session, pif_ref) - @rtype: callable object - """ - return lambda *args, **kwargs: \ - _check_ref(lambda r: r in XendNode.instance().pifs, - 'PIF', func, *args, **kwargs) - -def valid_pif_metrics(func): - """Decorator to verify if pif_metrics_ref is valid before calling - method. - - @param func: function with params: (self, session, pif_metrics_ref) - @rtype: callable object - """ - return lambda *args, **kwargs: \ - _check_ref(lambda r: r in XendNode.instance().pif_metrics, - 'PIF_metrics', func, *args, **kwargs) - def valid_task(func): """Decorator to verify if task_ref is valid before calling method. @@ -463,6 +412,20 @@ def valid_debug(func): return lambda *args, **kwargs: \ _check_ref(lambda r: r in XendAPI._debug, 'debug', func, *args, **kwargs) + + +def valid_object(class_name): + """Decorator to verify if object is valid before calling + method. + + @param func: function with params: (self, session, pif_ref) + @rtype: callable object + """ + return lambda func: \ + lambda *args, **kwargs: \ + _check_ref(lambda r: \ + XendAPIStore.get(r, class_name) is not None, + 'PIF', func, *args, **kwargs) # ----------------------------- # Bridge to Legacy XM API calls @@ -494,9 +457,7 @@ classes = { 'host' : valid_host, 'host_cpu' : valid_host_cpu, 'host_metrics' : valid_host_metrics, - 'network' : valid_network, 'VM' : valid_vm, - 'VM_metrics' : valid_vm_metrics, 'VBD' : valid_vbd, 'VBD_metrics' : valid_vbd_metrics, 'VIF' : valid_vif, @@ -505,20 +466,22 @@ classes = { 'VTPM' : valid_vtpm, 'console' : valid_console, 'SR' : valid_sr, - 'PBD' : valid_pbd, - 'PIF' : valid_pif, - 'PIF_metrics' : valid_pif_metrics, 'task' : valid_task, 'debug' : valid_debug, + 'network' : valid_object("network"), + 'PIF' : valid_object("PIF"), + 'VM_metrics' : valid_object("VM_metrics"), + 'PBD' : valid_object("PBD"), + 'PIF_metrics' : valid_object("PIF_metrics") } autoplug_classes = { 'network' : XendNetwork, + 'PIF' : XendPIF, 'VM_metrics' : XendVMMetrics, - 'PBD' : XendPBD.XendPBD, + 'PBD' : XendPBD, 'PIF_metrics' : XendPIFMetrics, } - class XendAPI(object): """Implementation of the Xen-API in Xend. Expects to be @@ -570,7 +533,9 @@ class XendAPI(object): # all get_by_uuid() methods. for api_cls in classes.keys(): - if api_cls == 'session': + # We'll let the autoplug classes implement these functions + # themselves - its much cleaner to do it in the base class + if api_cls == 'session' or api_cls in autoplug_classes.keys(): continue get_by_uuid = '%s_get_by_uuid' % api_cls @@ -599,34 +564,48 @@ class XendAPI(object): # -------------------- # These have all of their methods grabbed out from the implementation # class, and wrapped up to be compatible with the Xen-API. + + def getter(ref, type): + return XendAPIStore.get(ref, type) for api_cls, impl_cls in autoplug_classes.items(): - def doit(n): - getter = getattr(cls, '_%s_get' % api_cls) + def doit(n): dot_n = '%s.%s' % (api_cls, n) full_n = '%s_%s' % (api_cls, n) if not hasattr(cls, full_n): f = getattr(impl_cls, n) argcounts[dot_n] = f.func_code.co_argcount + 1 - setattr(cls, full_n, + g = lambda api_cls: \ + setattr(cls, full_n, \ lambda s, session, ref, *args: \ xen_api_success( \ - f(getter(s, session, ref), *args))) - - ro_attrs = getattr(cls, '%s_attr_ro' % api_cls, []) - rw_attrs = getattr(cls, '%s_attr_rw' % api_cls, []) - methods = getattr(cls, '%s_methods' % api_cls, []) - funcs = getattr(cls, '%s_funcs' % api_cls, []) + f(getter(ref, api_cls), *args))) + g(api_cls) # Force api_cls to be captured + + def doit_func(n): + dot_n = '%s.%s' % (api_cls, n) + full_n = '%s_%s' % (api_cls, n) + if not hasattr(cls, full_n): + f = getattr(impl_cls, n) + argcounts[dot_n] = f.func_code.co_argcount + setattr(cls, full_n, \ + lambda s, session, *args: \ + xen_api_success( \ + f(*args))) + + ro_attrs = impl_cls.getAttrRO() + rw_attrs = impl_cls.getAttrRW() + methods = impl_cls.getMethods() + funcs = impl_cls.getFuncs() for attr_name in ro_attrs + rw_attrs: doit('get_%s' % attr_name) - for attr_name in rw_attrs + cls.Base_attr_rw: + for attr_name in rw_attrs: doit('set_%s' % attr_name) - for method_name, return_type in methods + cls.Base_methods: - doit('%s' % method_name) - for func_name, return_type in funcs + cls.Base_funcs: - doit('%s' % func_name) - + for method in methods: + doit('%s' % method) + for func in funcs: + doit_func('%s' % func) def wrap_method(name, new_f): try: @@ -692,31 +671,42 @@ class XendAPI(object): except AttributeError: log.warn("API call: %s not found" % n) - - ro_attrs = getattr(cls, '%s_attr_ro' % api_cls, []) - rw_attrs = getattr(cls, '%s_attr_rw' % api_cls, []) - methods = getattr(cls, '%s_methods' % api_cls, []) - funcs = getattr(cls, '%s_funcs' % api_cls, []) + if api_cls in autoplug_classes.keys(): + impl_cls = autoplug_classes[api_cls] + ro_attrs = impl_cls.getAttrRO() + rw_attrs = impl_cls.getAttrRW() + methods = map(lambda x: (x, ""), impl_cls.getMethods()) + funcs = map(lambda x: (x, ""), impl_cls.getFuncs()) + else: + ro_attrs = getattr(cls, '%s_attr_ro' % api_cls, []) \ + + cls.Base_attr_ro + rw_attrs = getattr(cls, '%s_attr_rw' % api_cls, []) \ + + cls.Base_attr_rw + methods = getattr(cls, '%s_methods' % api_cls, []) \ + + cls.Base_methods + funcs = getattr(cls, '%s_funcs' % api_cls, []) \ + + cls.Base_funcs # wrap validators around readable class attributes - for attr_name in ro_attrs + rw_attrs + cls.Base_attr_ro: + for attr_name in ro_attrs + rw_attrs: doit('%s.get_%s' % (api_cls, attr_name), True, async_support = False) # wrap validators around writable class attrributes - for attr_name in rw_attrs + cls.Base_attr_rw: + for attr_name in rw_attrs: doit('%s.set_%s' % (api_cls, attr_name), True, async_support = False) setter_event_wrapper(api_cls, attr_name) # wrap validators around methods - for method_name, return_type in methods + cls.Base_methods: + for method_name, return_type in methods: doit('%s.%s' % (api_cls, method_name), True, async_support = True) # wrap validators around class functions - for func_name, return_type in funcs + cls.Base_funcs: - doit('%s.%s' % (api_cls, func_name), False, async_support = True, + for func_name, return_type in funcs: + doit('%s.%s' % (api_cls, func_name), False, + async_support = True, return_type = return_type) ctor_event_wrapper(api_cls) @@ -952,7 +942,7 @@ class XendAPI(object): def host_get_resident_VMs(self, session, host_ref): return xen_api_success(XendDomain.instance().get_domain_refs()) def host_get_PBDs(self, _, ref): - return xen_api_success(XendPBD.get_all_refs()) + return xen_api_success(XendPBD.get_all()) def host_get_PIFs(self, session, ref): return xen_api_success(XendNode.instance().get_PIF_refs()) def host_get_host_CPUs(self, session, host_ref): @@ -1130,130 +1120,6 @@ class XendAPI(object): def _host_metrics_get_memory_free(self): node = XendNode.instance() return node.xc.physinfo()['free_memory'] * 1024 - - - # Xen API: Class network - # ---------------------------------------------------------------- - - network_attr_ro = ['VIFs', 'PIFs'] - network_attr_rw = ['name_label', - 'name_description', - 'other_config'] - network_methods = [('add_to_other_config', None), - ('remove_from_other_config', None), - ('destroy', None)] - network_funcs = [('create', None)] - - def _network_get(self, _, ref): - return XendNode.instance().get_network(ref) - - def network_get_all(self, _): - return xen_api_success(XendNode.instance().get_network_refs()) - - def network_create(self, _, record): - return xen_api_success(XendNode.instance().network_create(record)) - - def network_destroy(self, _, ref): - return xen_api_success(XendNode.instance().network_destroy(ref)) - - - # Xen API: Class PIF - # ---------------------------------------------------------------- - - PIF_attr_ro = ['network', - 'host', - 'metrics'] - PIF_attr_rw = ['device', - 'MAC', - 'MTU', - 'VLAN'] - - PIF_attr_inst = PIF_attr_rw - - PIF_methods = [('create_VLAN', 'int'), ('destroy', None)] - - def _get_PIF(self, ref): - return XendNode.instance().pifs[ref] - - def PIF_destroy(self, _, ref): - try: - return xen_api_success(XendNode.instance().PIF_destroy(ref)) - except PIFIsPhysical, exn: - return xen_api_error(['PIF_IS_PHYSICAL', ref]) - - # object methods - def PIF_get_record(self, _, ref): - return xen_api_success(self._get_PIF(ref).get_record()) - - def PIF_get_all(self, _): - return xen_api_success(XendNode.instance().pifs.keys()) - - def PIF_get_metrics(self, _, ref): - return xen_api_success(self._get_PIF(ref).metrics.uuid) - - def PIF_get_device(self, _, ref): - return xen_api_success(self._get_PIF(ref).device) - - def PIF_get_network(self, _, ref): - return xen_api_success(self._get_PIF(ref).network.uuid) - - def PIF_get_host(self, _, ref): - return xen_api_success(self._get_PIF(ref).host.uuid) - - def PIF_get_MAC(self, _, ref): - return xen_api_success(self._get_PIF(ref).mac) - - def PIF_get_MTU(self, _, ref): - return xen_api_success(self._get_PIF(ref).mtu) - - def PIF_get_VLAN(self, _, ref): - return xen_api_success(self._get_PIF(ref).vlan) - - def PIF_set_device(self, _, ref, device): - return xen_api_success(self._get_PIF(ref).set_device(device)) - - def PIF_set_MAC(self, _, ref, mac): - return xen_api_success(self._get_PIF(ref).set_mac(mac)) - - def PIF_set_MTU(self, _, ref, mtu): - return xen_api_success(self._get_PIF(ref).set_mtu(mtu)) - - def PIF_create_VLAN(self, _, ref, network, vlan): - try: - vlan = int(vlan) - except: - return xen_api_error(['VLAN_TAG_INVALID', vlan]) - - try: - node = XendNode.instance() - - if _is_valid_ref(network, node.is_valid_network): - return xen_api_success( - node.PIF_create_VLAN(ref, network, vlan)) - else: - return xen_api_error(['HANDLE_INVALID', 'network', network]) - except NetworkAlreadyConnected, exn: - return xen_api_error(['NETWORK_ALREADY_CONNECTED', - network, exn.pif_uuid]) - except VLANTagInvalid: - return xen_api_error(['VLAN_TAG_INVALID', vlan]) - - - # Xen API: Class PIF_metrics - # ---------------------------------------------------------------- - - PIF_metrics_attr_ro = ['io_read_kbs', - 'io_write_kbs', - 'last_updated'] - PIF_metrics_attr_rw = [] - PIF_metrics_methods = [] - - def PIF_metrics_get_all(self, _): - return xen_api_success(XendNode.instance().pif_metrics.keys()) - - def _PIF_metrics_get(self, _, ref): - return XendNode.instance().pif_metrics[ref] - # Xen API: Class VM # ---------------------------------------------------------------- @@ -1865,28 +1731,6 @@ class XendAPI(object): return xen_api_success_void() - # Xen API: Class VM_metrics - # ---------------------------------------------------------------- - - VM_metrics_attr_ro = ['memory_actual', - 'VCPUs_number', - 'VCPUs_utilisation', - 'VCPUs_CPU', - 'VCPUs_flags', - 'VCPUs_params', - 'state', - 'start_time', - 'last_updated'] - VM_metrics_attr_rw = [] - VM_metrics_methods = [] - - def _VM_metrics_get(self, _, ref): - return XendVMMetrics.get_by_uuid(ref) - - def VM_metrics_get_all(self, _): - return xen_api_success(XendVMMetrics.get_all()) - - # Xen API: Class VBD # ---------------------------------------------------------------- @@ -2570,33 +2414,6 @@ class XendAPI(object): return xen_api_success_void() - # Xen API: Class PBD - # ---------------------------------------------------------------- - - PBD_attr_ro = ['host', - 'SR', - 'device_config', - 'currently_attached'] - PBD_attr_rw = [] - PBD_methods = [('destroy', None)] - PBD_funcs = [('create', None)] - - def PBD_get_all(self, _): - return xen_api_success(XendPBD.get_all_refs()) - - def _PBD_get(self, _, ref): - return XendPBD.get(ref) - - def PBD_create(self, _, record): - if 'uuid' in record: - return xen_api_error(['VALUE_NOT_SUPPORTED', - 'uuid', record['uuid'], - 'You may not specify a UUID on creation']) - new_uuid = XendPBD.XendPBD(record).get_uuid() - XendNode.instance().save() - return xen_api_success(new_uuid) - - # Xen API: Class event # ---------------------------------------------------------------- _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |