moonraker: refactor "make_request"

The make_request() method is now awaitable and returns the result directly vs the previous behavior of returning a request that was awaited.

There is no longer a need to check the result to see if it is an error, exceptions are raised if an error is detected.

Signed-off-by:  Eric Callahan <arksine.code@gmail.com>
This commit is contained in:
Arksine 2020-08-12 08:43:37 -04:00
parent d04a419a80
commit a7147a44ca
7 changed files with 71 additions and 72 deletions

View File

@ -259,12 +259,12 @@ class RemoteRequestHandler(AuthorizedRequestHandler):
args = {} args = {}
if self.request.query: if self.request.query:
args = self.query_parser(self.request) args = self.query_parser(self.request)
request = self.server.make_request( try:
self.remote_callback, method, args) result = await self.server.make_request(
result = await request.wait() self.remote_callback, method, args)
if isinstance(result, ServerError): except ServerError as e:
raise tornado.web.HTTPError( raise tornado.web.HTTPError(
result.status_code, str(result)) e.status_code, str(e)) from e
self.finish({'result': result}) self.finish({'result': result})
class LocalRequestHandler(AuthorizedRequestHandler): class LocalRequestHandler(AuthorizedRequestHandler):
@ -301,7 +301,7 @@ class LocalRequestHandler(AuthorizedRequestHandler):
result = await self.callback(self.request.path, method, args) result = await self.callback(self.request.path, method, args)
except ServerError as e: except ServerError as e:
raise tornado.web.HTTPError( raise tornado.web.HTTPError(
e.status_code, str(e)) e.status_code, str(e)) from e
self.finish({'result': result}) self.finish({'result': result})

View File

@ -217,51 +217,53 @@ class Server:
self.init_cb.stop() self.init_cb.stop()
async def _request_endpoints(self): async def _request_endpoints(self):
request = self.make_request("list_endpoints", "GET", {}) try:
result = await request.wait() result = await self.make_request("list_endpoints", "GET", {})
if not isinstance(result, ServerError): except ServerError:
endpoints = result.get('hooks', {}) return
static_paths = result.get('static_paths', {}) endpoints = result.get('hooks', {})
for ep in endpoints: static_paths = result.get('static_paths', {})
self.moonraker_app.register_remote_handler(ep) for ep in endpoints:
mutable_paths = {sp['resource_id']: sp['file_path'] self.moonraker_app.register_remote_handler(ep)
for sp in static_paths} mutable_paths = {sp['resource_id']: sp['file_path']
file_manager = self.lookup_plugin('file_manager') for sp in static_paths}
file_manager.update_mutable_paths(mutable_paths) file_manager = self.lookup_plugin('file_manager')
file_manager.update_mutable_paths(mutable_paths)
async def _check_available_objects(self): async def _check_available_objects(self):
request = self.make_request("objects/list", "GET", {}) try:
result = await request.wait() result = await self.make_request("objects/list", "GET", {})
if not isinstance(result, ServerError): except ServerError as e:
missing_objs = []
for obj in ["virtual_sdcard", "display_status", "pause_resume"]:
if obj not in result:
missing_objs.append(obj)
if missing_objs:
err_str = ", ".join([f"[{o}]" for o in missing_objs])
logging.info(
f"\nWarning, unable to detect the following printer "
f"objects:\n{err_str}\nPlease add the the above sections "
f"to printer.cfg for full Moonraker functionality.")
else:
logging.info( logging.info(
f"{result}\nUnable to retreive Klipper Object List") f"{e}\nUnable to retreive Klipper Object List")
return
missing_objs = []
for obj in ["virtual_sdcard", "display_status", "pause_resume"]:
if obj not in result:
missing_objs.append(obj)
if missing_objs:
err_str = ", ".join([f"[{o}]" for o in missing_objs])
logging.info(
f"\nWarning, unable to detect the following printer "
f"objects:\n{err_str}\nPlease add the the above sections "
f"to printer.cfg for full Moonraker functionality.")
async def _check_ready(self): async def _check_ready(self):
request = self.make_request("info", "GET", {}) try:
result = await request.wait() result = await self.make_request("info", "GET", {})
if not isinstance(result, ServerError): except ServerError as e:
is_ready = result.get("is_ready", False)
if is_ready:
self._set_klippy_ready()
else:
msg = result.get("message", "Klippy Not Ready")
logging.info("\n" + msg)
else:
logging.info( logging.info(
f"{result}\nKlippy info request error. This indicates that\n" f"{e}\nKlippy info request error. This indicates that\n"
f"Klippy may have experienced an error during startup.\n" f"Klippy may have experienced an error during startup.\n"
f"Please check klippy.log for more information") f"Please check klippy.log for more information")
return
is_ready = result.get("is_ready", False)
if is_ready:
self._set_klippy_ready()
else:
msg = result.get("message", "Klippy Not Ready")
logging.info("\n" + msg)
def _handle_klippy_response(self, request_id, response): def _handle_klippy_response(self, request_id, response):
req = self.pending_requests.pop(request_id, None) req = self.pending_requests.pop(request_id, None)
@ -288,12 +290,13 @@ class Server:
def _process_status_update(self, status): def _process_status_update(self, status):
self.send_event("server:status_update", status) self.send_event("server:status_update", status)
def make_request(self, path, method, args): async def make_request(self, path, method, args):
base_request = BaseRequest(path, method, args) base_request = BaseRequest(path, method, args)
self.pending_requests[base_request.id] = base_request self.pending_requests[base_request.id] = base_request
self.ioloop.spawn_callback( self.ioloop.spawn_callback(
self.send_klippy_request, base_request) self.send_klippy_request, base_request)
return base_request result = await base_request.wait()
return result
async def _kill_server(self): async def _kill_server(self):
# XXX - Currently this function is not used. # XXX - Currently this function is not used.
@ -345,6 +348,8 @@ class BaseRequest:
self._event.clear() self._event.clear()
continue continue
break break
if isinstance(self.response, ServerError):
raise self.response
return self.response return self.response
def notify(self, response): def notify(self, response):

View File

@ -167,11 +167,8 @@ class FileManager:
async def _handle_operation_check(self, requested_path): async def _handle_operation_check(self, requested_path):
# Get virtual_sdcard status # Get virtual_sdcard status
request = self.server.make_request( result = await self.server.make_request(
"objects/status", 'GET', {'print_stats': []}) "objects/status", 'GET', {'print_stats': []})
result = await request.wait()
if isinstance(result, self.server.error):
raise result
pstats = result.get('print_stats', {}) pstats = result.get('print_stats', {})
loaded_file = pstats.get('filename', "") loaded_file = pstats.get('filename', "")
state = pstats.get('state', "") state = pstats.get('state', "")

View File

@ -32,11 +32,8 @@ class GCodeAPIs:
async def _send_gcode(self, script): async def _send_gcode(self, script):
args = {'script': script} args = {'script': script}
request = self.server.make_request( result = await self.server.make_request(
GCODE_ENDPOINT, 'POST', args) GCODE_ENDPOINT, 'POST', args)
result = await request.wait()
if isinstance(result, self.server.error):
raise result
return result return result
async def gcode_pause(self, path, method, args): async def gcode_pause(self, path, method, args):

View File

@ -196,10 +196,10 @@ class PanelDue:
} }
async def _klippy_request(self, command, method='GET', args={}): async def _klippy_request(self, command, method='GET', args={}):
request = self.server.make_request(command, method, args) try:
result = await request.wait() result = await self.server.make_request(command, method, args)
if isinstance(result, self.server.error): except self.server.error as e:
raise PanelDueError(str(result)) raise PanelDueError(str(e)) from e
return result return result
async def handle_klippy_state(self, state): async def handle_klippy_state(self, state):

View File

@ -36,22 +36,22 @@ class TemperatureStore:
return return
# Fetch sensors # Fetch sensors
request = self.server.make_request( try:
"objects/status", 'GET', {'heaters': []}) result = await self.server.make_request(
result = await request.wait() "objects/status", 'GET', {'heaters': []})
if isinstance(result, self.server.error): except self.server.error as e:
logging.info(f"Error Configuring Sensors: {result}") logging.info(f"Error Configuring Sensors: {e}")
return return
sensors = result.get("heaters", {}).get("available_sensors", []) sensors = result.get("heaters", {}).get("available_sensors", [])
if sensors: if sensors:
# Add Subscription # Add Subscription
sub = {s: [] for s in sensors} sub = {s: [] for s in sensors}
request = self.server.make_request( try:
"objects/subscription", 'POST', sub) result = await self.server.make_request(
result = await request.wait() "objects/subscription", 'POST', sub)
if isinstance(result, self.server.error): except self.server.error as e:
logging.info(f"Error subscribing to sensors: {result}") logging.info(f"Error subscribing to sensors: {e}")
return return
logging.info(f"Configuring available sensors: {sensors}") logging.info(f"Configuring available sensors: {sensors}")
new_store = {} new_store = {}

View File

@ -72,11 +72,12 @@ class JsonRPC:
result = await method(*args, **kwargs) result = await method(*args, **kwargs)
except TypeError as e: except TypeError as e:
return self.build_error(-32603, "Invalid params", req_id) return self.build_error(-32603, "Invalid params", req_id)
except ServerError as e:
return self.build_error(e.status_code, str(e), req_id)
except Exception as e: except Exception as e:
return self.build_error(-31000, str(e), req_id) return self.build_error(-31000, str(e), req_id)
if isinstance(result, ServerError):
return self.build_error(result.status_code, str(result), req_id) if req_id is None:
elif req_id is None:
return None return None
else: else:
return self.build_result(result, req_id) return self.build_result(result, req_id)
@ -142,9 +143,8 @@ class WebsocketManager:
def _generate_callback(self, endpoint, request_method): def _generate_callback(self, endpoint, request_method):
async def func(**kwargs): async def func(**kwargs):
request = self.server.make_request( result = await self.server.make_request(
endpoint, request_method, kwargs) endpoint, request_method, kwargs)
result = await request.wait()
return result return result
return func return func