Beispiel #1
0
    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
Beispiel #2
0
    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)
Beispiel #3
0
    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)
Beispiel #4
0
    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)