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