def _dynamicMethod(self, className, methodName, *args, **kwargs): rep = vdsmapi.MethodRep(className, methodName) argobj = self._name_args(args, kwargs, self._schema.get_arg_names(rep)) self._schema.verify_args(rep, argobj) api = self._get_api_instance(className, argobj) methodArgs = self._get_method_args(rep, argobj) # Call the override function (if given). Otherwise, just call directly cmd = '%s_%s' % (className, methodName) fn = command_info.get(cmd, {}).get('call') if fn: result = fn(api, argobj) else: fn = getattr(api, methodName) try: if _glusterEnabled: try: result = fn(*methodArgs) except ge.GlusterException as e: result = e.response() else: result = fn(*methodArgs) except TypeError as e: self.log.exception("TypeError raised by dispatched function") raise InvalidCall(fn, methodArgs, e) except VdsmException as e: raise yajsonrpc.JsonRpcError(e.code, str(e)) if result['status']['code']: code = result['status']['code'] msg = result['status']['message'] raise yajsonrpc.JsonRpcError(code, msg) retfield = command_info.get(cmd, {}).get('ret') if isinstance(retfield, types.FunctionType): if cmd == 'Host_getCapabilities': ret = retfield(self._threadLocal.server, result) else: ret = retfield(result) elif _glusterEnabled and className.startswith('Gluster'): ret = dict([(key, value) for key, value in result.items() if key is not 'status']) else: ret = self._get_result(result, retfield) self._schema.verify_retval(vdsmapi.MethodRep(className, methodName), ret) return ret
def _dynamicMethod(self, className, methodName, *args, **kwargs): argobj = self._nameArgs(args, kwargs, self._getArgList(className, methodName)) api = self._getApiInstance(className, argobj) methodArgs = self._getMethodArgs(className, methodName, argobj) self._fixupArgs(className, methodName, methodArgs) # Call the override function (if given). Otherwise, just call directly cmd = '%s_%s' % (className, methodName) fn = command_info.get(cmd, {}).get('call') if fn: result = fn(api, argobj) else: fn = getattr(api, methodName) result = fn(*methodArgs) if result['status']['code']: code = result['status']['code'] msg = result['status']['message'] raise yajsonrpc.JsonRpcError(code, msg) retfield = command_info.get(cmd, {}).get('ret') if isinstance(retfield, types.FunctionType): ret = retfield(result) else: ret = self._getResult(result, retfield) return self._fixupRet(className, methodName, ret)
def dispatch(self, name, argobj): methodName = name.replace('.', '_') result = None try: fn = getattr(self, methodName) except AttributeError: raise yajsonrpc.JsonRpcMethodNotFoundError() try: result = fn(argobj) except VdsmError, e: # TBD: Do we really want to always log here self.log.debug("Operation failed, returning error", exc_info=True) raise yajsonrpc.JsonRpcError(e.code, e.message)
def _dynamicMethod(self, className, methodName, *args, **kwargs): argobj = self._nameArgs(args, kwargs, self._getArgList(className, methodName)) api = self._getApiInstance(className, argobj) methodArgs = self._getMethodArgs(className, methodName, argobj) self._fixupArgs(className, methodName, methodArgs) # Call the override function (if given). Otherwise, just call directly cmd = '%s_%s' % (className, methodName) fn = command_info.get(cmd, {}).get('call') if fn: result = fn(api, argobj) else: fn = getattr(api, methodName) try: if _glusterEnabled: try: result = fn(*methodArgs) except ge.GlusterException as e: result = e.response() else: result = fn(*methodArgs) except TypeError as e: raise InvalidCall(fn, methodArgs, e) if result['status']['code']: code = result['status']['code'] msg = result['status']['message'] raise yajsonrpc.JsonRpcError(code, msg) retfield = command_info.get(cmd, {}).get('ret') if isinstance(retfield, types.FunctionType): if cmd == 'Host_getCapabilities': ret = retfield(self._threadLocal.server, result) else: ret = retfield(result) elif _glusterEnabled and className.startswith('Gluster'): ret = dict([(key, value) for key, value in result.items() if key is not 'status']) else: ret = self._getResult(result, retfield) return self._fixupRet(className, methodName, ret)