From e8ebbd2b2934f010272926947fc0f9a53b2241cf Mon Sep 17 00:00:00 2001 From: Michael Hanselmann <hansmi@google.com> Date: Fri, 14 May 2010 19:08:21 +0200 Subject: [PATCH] RAPI: /2/{nodes,instances}/$name should return 404 for unknown items Currently they return a 500 Server Error, not really useful for detecting nonexistent items. Signed-off-by: Michael Hanselmann <hansmi@google.com> Reviewed-by: Iustin Pop <iustin@google.com> --- lib/rapi/baserlib.py | 14 ++++++++++++++ lib/rapi/rlib2.py | 13 +++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/rapi/baserlib.py b/lib/rapi/baserlib.py index fb4c48e77..0361e4740 100644 --- a/lib/rapi/baserlib.py +++ b/lib/rapi/baserlib.py @@ -195,6 +195,20 @@ def SubmitJob(op, cl=None): raise http.HttpGatewayTimeout("Timeout while talking to the master" " daemon. Error: %s" % str(err)) + +def HandleItemQueryErrors(fn, *args, **kwargs): + """Converts errors when querying a single item. + + """ + try: + return fn(*args, **kwargs) + except errors.OpPrereqError, err: + if len(err.args) == 2 and err.args[1] == errors.ECODE_NOENT: + raise http.HttpNotFound() + + raise + + def GetClient(): """Geric wrapper for luxi.Client(), for better http compatiblity. diff --git a/lib/rapi/rlib2.py b/lib/rapi/rlib2.py index 9275a8039..e15546e8a 100644 --- a/lib/rapi/rlib2.py +++ b/lib/rapi/rlib2.py @@ -312,8 +312,10 @@ class R_2_nodes_name(baserlib.R_Generic): """ node_name = self.items[0] client = baserlib.GetClient() - result = client.QueryNodes(names=[node_name], fields=N_FIELDS, - use_locking=self.useLocking()) + + result = baserlib.HandleItemQueryErrors(client.QueryNodes, + names=[node_name], fields=N_FIELDS, + use_locking=self.useLocking()) return baserlib.MapFields(N_FIELDS, result[0]) @@ -699,8 +701,11 @@ class R_2_instances_name(baserlib.R_Generic): """ client = baserlib.GetClient() instance_name = self.items[0] - result = client.QueryInstances(names=[instance_name], fields=I_FIELDS, - use_locking=self.useLocking()) + + result = baserlib.HandleItemQueryErrors(client.QueryInstances, + names=[instance_name], + fields=I_FIELDS, + use_locking=self.useLocking()) return baserlib.MapFields(I_FIELDS, result[0]) -- GitLab