def _call(self, *args, **kwargs): """Core of RPC dispatch without error interpretation, logging, or return value decoding.""" params = kwargs if len(kwargs) else args jsonrpc_params = {"jsonrpc": self.__version, "method": self.__service_name, 'params': params, 'id': message_id() } parameters = json.dumps(jsonrpc_params) url = self._get_url(jsonrpc_params) if "serverless" in url or "server-less" in url: raise exceptions.ServiceError("Configured for server-less mode. Skipping JSON RPC " + repr(self.__service_name)) if log.get_verbose() <= 50: log.verbose("CRDS JSON RPC", self.__service_name, params if len(str(params)) <= 60 else "(...)", "-->") else: log.verbose("CRDS JSON RPC to", url, "parameters", params, "-->") response = apply_with_retries(self._call_service, parameters, url) try: rval = json.loads(response) except Exception as exc: log.warning("Invalid CRDS jsonrpc response:\n", response) raise return rval
def classify_exception(self, decoded): """Interpret exc __str__ to define as more precise CRDS exception.""" if "Channel" in decoded and "not found" in decoded: return exceptions.StatusChannelNotFoundError(decoded) elif "External agent requested calling process termination." in decoded: return exceptions.OwningProcessAbortedError(decoded) else: msg = "CRDS jsonrpc failure " + repr(self.__service_name) + " " + str(decoded) return exceptions.ServiceError(msg)
def _call_service(self, parameters, url): """Call the JSONRPC defined by `parameters` and raise a ServiceError on any exception.""" if not isinstance(parameters, bytes): parameters = parameters.encode("utf-8") try: channel = request.urlopen(url, parameters) return channel.read().decode("utf-8") except Exception as exc: raise exceptions.ServiceError("CRDS jsonrpc failure " + repr(self.__service_name) + " " + str(exc)) from exc
def _call(self, *args, **kwargs): """Core of RPC dispatch without error interpretation, logging, or return value decoding.""" params = kwargs if len(kwargs) else args # if Any.kind(params) == Object and self.__version != '2.0': # raise Exception('Unsupport arg type for JSON-RPC 1.0 ' # '(the default version for this client, ' # 'pass version="2.0" to use keyword arguments)') jsonrpc_params = { "jsonrpc": self.__version, "method": self.__service_name, 'params': params, 'id': message_id() } parameters = json.dumps(jsonrpc_params) url = self._get_url(jsonrpc_params) if "serverless" in url or "server-less" in url: raise exceptions.ServiceError( "Configured for server-less mode. Skipping JSON RPC " + repr(self.__service_name)) if log.get_verbose() <= 50: log.verbose("CRDS JSON RPC", self.__service_name, params if len(str(params)) <= 60 else "(...)", "-->") else: log.verbose("CRDS JSON RPC to", url, "parameters", params, "-->") response = apply_with_retries(self._call_service, parameters, url) try: rval = json.loads(response) except Exception as exc: log.warning("Invalid CRDS jsonrpc response:\n", response) raise return rval