change backend to raise custom exceptions
authorSofia Papagiannaki <papagian@gmail.com>
Thu, 28 Jun 2012 12:51:01 +0000 (15:51 +0300)
committerSofia Papagiannaki <papagian@gmail.com>
Thu, 28 Jun 2012 12:51:01 +0000 (15:51 +0300)
snf-pithos-app/pithos/api/functions.py
snf-pithos-app/pithos/api/util.py
snf-pithos-backend/pithos/backends/base.py
snf-pithos-backend/pithos/backends/modular.py

index 65e56d1..37df0db 100644 (file)
@@ -54,7 +54,8 @@ from pithos.api.util import (json_encode_decimal, rename_meta_key, format_header
     SaveToBackendHandler, object_data_response, put_object_block, hashmap_md5, simple_list_response, api_method)
 from pithos.api.settings import UPDATE_MD5
 
     SaveToBackendHandler, object_data_response, put_object_block, hashmap_md5, simple_list_response, api_method)
 from pithos.api.settings import UPDATE_MD5
 
-from pithos.backends.base import NotAllowedError, QuotaError
+from pithos.backends.base import NotAllowedError, QuotaError, ContainerNotEmpty, ItemNotExists, VersionNotExists
+
 from pithos.backends.filter import parse_filters
 
 import logging
 from pithos.backends.filter import parse_filters
 
 import logging
@@ -330,7 +331,7 @@ def container_meta(request, v_account, v_container):
                                                         v_container)
     except NotAllowedError:
         raise Forbidden('Not allowed')
                                                         v_container)
     except NotAllowedError:
         raise Forbidden('Not allowed')
-    except NameError:
+    except ItemNotExists:
         raise ItemNotFound('Container does not exist')
     
     validate_modification_preconditions(request, meta)
         raise ItemNotFound('Container does not exist')
     
     validate_modification_preconditions(request, meta)
@@ -365,7 +366,7 @@ def container_create(request, v_account, v_container):
                                             v_container, policy, replace=False)
         except NotAllowedError:
             raise Forbidden('Not allowed')
                                             v_container, policy, replace=False)
         except NotAllowedError:
             raise Forbidden('Not allowed')
-        except NameError:
+        except ItemNotExists:
             raise ItemNotFound('Container does not exist')
         except ValueError:
             raise BadRequest('Invalid policy header')
             raise ItemNotFound('Container does not exist')
         except ValueError:
             raise BadRequest('Invalid policy header')
@@ -375,7 +376,7 @@ def container_create(request, v_account, v_container):
                                             v_container, 'pithos', meta, replace=False)
         except NotAllowedError:
             raise Forbidden('Not allowed')
                                             v_container, 'pithos', meta, replace=False)
         except NotAllowedError:
             raise Forbidden('Not allowed')
-        except NameError:
+        except ItemNotExists:
             raise ItemNotFound('Container does not exist')
     
     return HttpResponse(status=ret)
             raise ItemNotFound('Container does not exist')
     
     return HttpResponse(status=ret)
@@ -398,7 +399,7 @@ def container_update(request, v_account, v_container):
                                                 v_container, policy, replace)
         except NotAllowedError:
             raise Forbidden('Not allowed')
                                                 v_container, policy, replace)
         except NotAllowedError:
             raise Forbidden('Not allowed')
-        except NameError:
+        except ItemNotExists:
             raise ItemNotFound('Container does not exist')
         except ValueError:
             raise BadRequest('Invalid policy header')
             raise ItemNotFound('Container does not exist')
         except ValueError:
             raise BadRequest('Invalid policy header')
@@ -408,7 +409,7 @@ def container_update(request, v_account, v_container):
                                                     v_container, 'pithos', meta, replace)
         except NotAllowedError:
             raise Forbidden('Not allowed')
                                                     v_container, 'pithos', meta, replace)
         except NotAllowedError:
             raise Forbidden('Not allowed')
-        except NameError:
+        except ItemNotExists:
             raise ItemNotFound('Container does not exist')
     
     content_length = -1
             raise ItemNotFound('Container does not exist')
     
     content_length = -1
@@ -443,9 +444,9 @@ def container_delete(request, v_account, v_container):
                                             until)
     except NotAllowedError:
         raise Forbidden('Not allowed')
                                             until)
     except NotAllowedError:
         raise Forbidden('Not allowed')
-    except NameError:
+    except ItemNotExists:
         raise ItemNotFound('Container does not exist')
         raise ItemNotFound('Container does not exist')
-    except IndexError:
+    except ContainerNotEmpty:
         raise Conflict('Container is not empty')
     return HttpResponse(status=204)
 
         raise Conflict('Container is not empty')
     return HttpResponse(status=204)
 
@@ -467,7 +468,7 @@ def object_list(request, v_account, v_container):
                                                         v_container)
     except NotAllowedError:
         raise Forbidden('Not allowed')
                                                         v_container)
     except NotAllowedError:
         raise Forbidden('Not allowed')
-    except NameError:
+    except ItemNotExists:
         raise ItemNotFound('Container does not exist')
     
     validate_modification_preconditions(request, meta)
         raise ItemNotFound('Container does not exist')
     
     validate_modification_preconditions(request, meta)
@@ -524,7 +525,7 @@ def object_list(request, v_account, v_container):
                                         until, None, public)
         except NotAllowedError:
             raise Forbidden('Not allowed')
                                         until, None, public)
         except NotAllowedError:
             raise Forbidden('Not allowed')
-        except NameError:
+        except ItemNotExists:
             raise ItemNotFound('Container does not exist')
         
         if len(objects) == 0:
             raise ItemNotFound('Container does not exist')
         
         if len(objects) == 0:
@@ -553,7 +554,7 @@ def object_list(request, v_account, v_container):
                 object_public[k[name_idx:]] = v
     except NotAllowedError:
         raise Forbidden('Not allowed')
                 object_public[k[name_idx:]] = v
     except NotAllowedError:
         raise Forbidden('Not allowed')
-    except NameError:
+    except ItemNotExists:
         raise ItemNotFound('Container does not exist')
     
     object_meta = []
         raise ItemNotFound('Container does not exist')
     
     object_meta = []
@@ -610,9 +611,9 @@ def object_meta(request, v_account, v_container, v_object):
             public = None
     except NotAllowedError:
         raise Forbidden('Not allowed')
             public = None
     except NotAllowedError:
         raise Forbidden('Not allowed')
-    except NameError:
+    except ItemNotExists:
         raise ItemNotFound('Object does not exist')
         raise ItemNotFound('Object does not exist')
-    except IndexError:
+    except VersionNotExists:
         raise ItemNotFound('Version does not exist')
     
     update_manifest_meta(request, v_account, meta)
         raise ItemNotFound('Version does not exist')
     
     update_manifest_meta(request, v_account, meta)
@@ -679,9 +680,9 @@ def object_read(request, v_account, v_container, v_object):
             public = None
     except NotAllowedError:
         raise Forbidden('Not allowed')
             public = None
     except NotAllowedError:
         raise Forbidden('Not allowed')
-    except NameError:
+    except ItemNotExists:
         raise ItemNotFound('Object does not exist')
         raise ItemNotFound('Object does not exist')
-    except IndexError:
+    except VersionNotExists:
         raise ItemNotFound('Version does not exist')
     
     update_manifest_meta(request, v_account, meta)
         raise ItemNotFound('Version does not exist')
     
     update_manifest_meta(request, v_account, meta)
@@ -712,7 +713,7 @@ def object_read(request, v_account, v_container, v_object):
             raise Forbidden('Not allowed')
         except ValueError:
             raise BadRequest('Invalid X-Object-Manifest header')
             raise Forbidden('Not allowed')
         except ValueError:
             raise BadRequest('Invalid X-Object-Manifest header')
-        except NameError:
+        except ItemNotExists:
             raise ItemNotFound('Container does not exist')
         
         try:
             raise ItemNotFound('Container does not exist')
         
         try:
@@ -723,9 +724,9 @@ def object_read(request, v_account, v_container, v_object):
                 hashmaps.append(h)
         except NotAllowedError:
             raise Forbidden('Not allowed')
                 hashmaps.append(h)
         except NotAllowedError:
             raise Forbidden('Not allowed')
-        except NameError:
+        except ItemNotExists:
             raise ItemNotFound('Object does not exist')
             raise ItemNotFound('Object does not exist')
-        except IndexError:
+        except VersionNotExists:
             raise ItemNotFound('Version does not exist')
     else:
         try:
             raise ItemNotFound('Version does not exist')
     else:
         try:
@@ -735,9 +736,9 @@ def object_read(request, v_account, v_container, v_object):
             hashmaps.append(h)
         except NotAllowedError:
             raise Forbidden('Not allowed')
             hashmaps.append(h)
         except NotAllowedError:
             raise Forbidden('Not allowed')
-        except NameError:
+        except ItemNotExists:
             raise ItemNotFound('Object does not exist')
             raise ItemNotFound('Object does not exist')
-        except IndexError:
+        except VersionNotExists:
             raise ItemNotFound('Version does not exist')
     
     # Reply with the hashmap.
             raise ItemNotFound('Version does not exist')
     
     # Reply with the hashmap.
@@ -877,7 +878,7 @@ def object_write(request, v_account, v_container, v_object):
         raise Forbidden('Not allowed')
     except IndexError, e:
         raise Conflict(simple_list_response(request, e.data))
         raise Forbidden('Not allowed')
     except IndexError, e:
         raise Conflict(simple_list_response(request, e.data))
-    except NameError:
+    except ItemNotExists:
         raise ItemNotFound('Container does not exist')
     except ValueError:
         raise BadRequest('Invalid sharing header')
         raise ItemNotFound('Container does not exist')
     except ValueError:
         raise BadRequest('Invalid sharing header')
@@ -897,7 +898,7 @@ def object_write(request, v_account, v_container, v_object):
                                                 v_container, v_object, public)
         except NotAllowedError:
             raise Forbidden('Not allowed')
                                                 v_container, v_object, public)
         except NotAllowedError:
             raise Forbidden('Not allowed')
-        except NameError:
+        except ItemNotExists:
             raise ItemNotFound('Object does not exist')
     
     response = HttpResponse(status=201)
             raise ItemNotFound('Object does not exist')
     
     response = HttpResponse(status=201)
@@ -926,7 +927,7 @@ def object_write_form(request, v_account, v_container, v_object):
                         file.hashmap, checksum, 'pithos', {}, True)
     except NotAllowedError:
         raise Forbidden('Not allowed')
                         file.hashmap, checksum, 'pithos', {}, True)
     except NotAllowedError:
         raise Forbidden('Not allowed')
-    except NameError:
+    except ItemNotExists:
         raise ItemNotFound('Container does not exist')
     except QuotaError:
         raise RequestEntityTooLarge('Quota exceeded')
         raise ItemNotFound('Container does not exist')
     except QuotaError:
         raise RequestEntityTooLarge('Quota exceeded')
@@ -964,7 +965,7 @@ def object_copy(request, v_account, v_container, v_object):
                                             v_container, v_object, 'pithos', src_version)
         except NotAllowedError:
             raise Forbidden('Not allowed')
                                             v_container, v_object, 'pithos', src_version)
         except NotAllowedError:
             raise Forbidden('Not allowed')
-        except (NameError, IndexError):
+        except (ItemNotExists, VersionNotExists):
             raise ItemNotFound('Container or object does not exist')
         validate_matching_preconditions(request, meta)
     
             raise ItemNotFound('Container or object does not exist')
         validate_matching_preconditions(request, meta)
     
@@ -1002,7 +1003,7 @@ def object_move(request, v_account, v_container, v_object):
                                                     v_container, v_object, 'pithos')
         except NotAllowedError:
             raise Forbidden('Not allowed')
                                                     v_container, v_object, 'pithos')
         except NotAllowedError:
             raise Forbidden('Not allowed')
-        except NameError:
+        except ItemNotExists:
             raise ItemNotFound('Container or object does not exist')
         validate_matching_preconditions(request, meta)
     
             raise ItemNotFound('Container or object does not exist')
         validate_matching_preconditions(request, meta)
     
@@ -1030,7 +1031,7 @@ def object_update(request, v_account, v_container, v_object):
                                                     v_container, v_object, 'pithos')
     except NotAllowedError:
         raise Forbidden('Not allowed')
                                                     v_container, v_object, 'pithos')
     except NotAllowedError:
         raise Forbidden('Not allowed')
-    except NameError:
+    except ItemNotExists:
         raise ItemNotFound('Object does not exist')
     
     # Evaluate conditions.
         raise ItemNotFound('Object does not exist')
     
     # Evaluate conditions.
@@ -1053,7 +1054,7 @@ def object_update(request, v_account, v_container, v_object):
                                 v_account, v_container, v_object, permissions)
             except NotAllowedError:
                 raise Forbidden('Not allowed')
                                 v_account, v_container, v_object, permissions)
             except NotAllowedError:
                 raise Forbidden('Not allowed')
-            except NameError:
+            except ItemNotExists:
                 raise ItemNotFound('Object does not exist')
             except ValueError:
                 raise BadRequest('Invalid sharing header')
                 raise ItemNotFound('Object does not exist')
             except ValueError:
                 raise BadRequest('Invalid sharing header')
@@ -1063,7 +1064,7 @@ def object_update(request, v_account, v_container, v_object):
                                                 v_container, v_object, public)
             except NotAllowedError:
                 raise Forbidden('Not allowed')
                                                 v_container, v_object, public)
             except NotAllowedError:
                 raise Forbidden('Not allowed')
-            except NameError:
+            except ItemNotExists:
                 raise ItemNotFound('Object does not exist')
         if meta or replace:
             try:
                 raise ItemNotFound('Object does not exist')
         if meta or replace:
             try:
@@ -1071,7 +1072,7 @@ def object_update(request, v_account, v_container, v_object):
                                 v_account, v_container, v_object, 'pithos', meta, replace)
             except NotAllowedError:
                 raise Forbidden('Not allowed')
                                 v_account, v_container, v_object, 'pithos', meta, replace)
             except NotAllowedError:
                 raise Forbidden('Not allowed')
-            except NameError:
+            except ItemNotExists:
                 raise ItemNotFound('Object does not exist')        
             response['X-Object-Version'] = version_id
         
                 raise ItemNotFound('Object does not exist')        
             response['X-Object-Version'] = version_id
         
@@ -1092,7 +1093,7 @@ def object_update(request, v_account, v_container, v_object):
                                             v_account, v_container, v_object)
     except NotAllowedError:
         raise Forbidden('Not allowed')
                                             v_account, v_container, v_object)
     except NotAllowedError:
         raise Forbidden('Not allowed')
-    except NameError:
+    except ItemNotExists:
         raise ItemNotFound('Object does not exist')
     
     offset, length, total = ranges
         raise ItemNotFound('Object does not exist')
     
     offset, length, total = ranges
@@ -1111,7 +1112,7 @@ def object_update(request, v_account, v_container, v_object):
                                         src_account, src_container, src_name, src_version)
         except NotAllowedError:
             raise Forbidden('Not allowed')
                                         src_account, src_container, src_name, src_version)
         except NotAllowedError:
             raise Forbidden('Not allowed')
-        except NameError:
+        except ItemNotExists:
             raise ItemNotFound('Source object does not exist')
         
         if length is None:
             raise ItemNotFound('Source object does not exist')
         
         if length is None:
@@ -1197,7 +1198,7 @@ def object_update(request, v_account, v_container, v_object):
                         hashmap, checksum, 'pithos', meta, replace, permissions)
     except NotAllowedError:
         raise Forbidden('Not allowed')
                         hashmap, checksum, 'pithos', meta, replace, permissions)
     except NotAllowedError:
         raise Forbidden('Not allowed')
-    except NameError:
+    except ItemNotExists:
         raise ItemNotFound('Container does not exist')
     except ValueError:
         raise BadRequest('Invalid sharing header')
         raise ItemNotFound('Container does not exist')
     except ValueError:
         raise BadRequest('Invalid sharing header')
@@ -1209,7 +1210,7 @@ def object_update(request, v_account, v_container, v_object):
                                                 v_container, v_object, public)
         except NotAllowedError:
             raise Forbidden('Not allowed')
                                                 v_container, v_object, public)
         except NotAllowedError:
             raise Forbidden('Not allowed')
-        except NameError:
+        except ItemNotExists:
             raise ItemNotFound('Object does not exist')
     
     response = HttpResponse(status=204)
             raise ItemNotFound('Object does not exist')
     
     response = HttpResponse(status=204)
@@ -1233,7 +1234,7 @@ def object_delete(request, v_account, v_container, v_object):
                                         v_object, until, delimiter=delimiter)
     except NotAllowedError:
         raise Forbidden('Not allowed')
                                         v_object, until, delimiter=delimiter)
     except NotAllowedError:
         raise Forbidden('Not allowed')
-    except NameError:
+    except ItemNotExists:
         raise ItemNotFound('Object does not exist')
     return HttpResponse(status=204)
 
         raise ItemNotFound('Object does not exist')
     return HttpResponse(status=204)
 
index c3a8fd8..0055d9a 100644 (file)
@@ -64,7 +64,7 @@ from pithos.api.settings import (BACKEND_DB_MODULE, BACKEND_DB_CONNECTION,
                                     SERVICE_TOKEN, COOKIE_NAME)
 
 from pithos.backends import connect_backend
                                     SERVICE_TOKEN, COOKIE_NAME)
 
 from pithos.backends import connect_backend
-from pithos.backends.base import NotAllowedError, QuotaError
+from pithos.backends.base import NotAllowedError, QuotaError, ItemNotExists, VersionNotExists
 
 import logging
 import re
 
 import logging
 import re
@@ -340,7 +340,7 @@ def copy_or_move_object(request, src_account, src_container, src_name, dest_acco
                                                         content_type, 'pithos', meta, False, permissions, src_version, delimiter)
     except NotAllowedError:
         raise Forbidden('Not allowed')
                                                         content_type, 'pithos', meta, False, permissions, src_version, delimiter)
     except NotAllowedError:
         raise Forbidden('Not allowed')
-    except (NameError, IndexError):
+    except (ItemNotExists, VersionNotExists):
         raise ItemNotFound('Container or object does not exist')
     except ValueError:
         raise BadRequest('Invalid sharing header')
         raise ItemNotFound('Container or object does not exist')
     except ValueError:
         raise BadRequest('Invalid sharing header')
@@ -351,7 +351,7 @@ def copy_or_move_object(request, src_account, src_container, src_name, dest_acco
             request.backend.update_object_public(request.user_uniq, dest_account, dest_container, dest_name, public)
         except NotAllowedError:
             raise Forbidden('Not allowed')
             request.backend.update_object_public(request.user_uniq, dest_account, dest_container, dest_name, public)
         except NotAllowedError:
             raise Forbidden('Not allowed')
-        except NameError:
+        except ItemNotExists:
             raise ItemNotFound('Object does not exist')
     return version_id
 
             raise ItemNotFound('Object does not exist')
     return version_id
 
@@ -662,7 +662,7 @@ class ObjectWrapper(object):
                 self.block_hash = self.hashmaps[self.file_index][self.block_index]
                 try:
                     self.block = self.backend.get_block(self.block_hash)
                 self.block_hash = self.hashmaps[self.file_index][self.block_index]
                 try:
                     self.block = self.backend.get_block(self.block_hash)
-                except NameError:
+                except ItemNotExists:
                     raise ItemNotFound('Block does not exist')
             
             # Get the data from the block.
                     raise ItemNotFound('Block does not exist')
             
             # Get the data from the block.
index 0d4e198..9a68362 100644 (file)
@@ -42,6 +42,24 @@ class NotAllowedError(Exception):
 class QuotaError(Exception):
     pass
 
 class QuotaError(Exception):
     pass
 
+class AccountExists(NameError):
+    pass
+    
+class ContainerExists(NameError):
+    pass
+
+class AccountNotEmpty(IndexError):
+    pass
+
+class ContainerNotEmpty(IndexError):
+    pass
+
+class ItemNotExists(NameError):
+    pass
+
+class VersionNotExists(IndexError):
+    pass
+
 class BaseBackend(object):
     """Abstract backend class that serves as a reference for actual implementations.
     
 class BaseBackend(object):
     """Abstract backend class that serves as a reference for actual implementations.
     
@@ -165,7 +183,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            IndexError: Account is not empty
+            AccountNotEmpty: Account is not empty
         """
         return
     
         """
         return
     
@@ -193,7 +211,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container does not exist
+            ItemNotExists: Container does not exist
         """
         return []
     
         """
         return []
     
@@ -214,7 +232,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container does not exist
+            ItemNotExists: Container does not exist
         """
         return {}
     
         """
         return {}
     
@@ -231,7 +249,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container does not exist
+            ItemNotExists: Container does not exist
         """
         return
     
         """
         return
     
@@ -246,7 +264,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container does not exist
+            ItemNotExists: Container does not exist
         """
         return {}
     
         """
         return {}
     
@@ -256,7 +274,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container does not exist
+            ItemNotExists: Container does not exist
             
             ValueError: Invalid policy defined
         """
             
             ValueError: Invalid policy defined
         """
@@ -268,7 +286,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container already exists
+            ContainerExists: Container already exists
             
             ValueError: Invalid policy defined
         """
             
             ValueError: Invalid policy defined
         """
@@ -280,9 +298,9 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container does not exist
+            ItemNotExists: Container does not exist
             
             
-            IndexError: Container is not empty
+            ContainerNotEmpty: Container is not empty
         """
         return
     
         """
         return
     
@@ -321,7 +339,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container does not exist
+            ItemNotExists: Container does not exist
         """
         return []
     
         """
         return []
     
@@ -334,7 +352,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container does not exist
+            ItemNotExists: Container does not exist
         """
         return []
     
         """
         return []
     
@@ -377,9 +395,9 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container/object does not exist
+            ItemNotExists: Container/object does not exist
             
             
-            IndexError: Version does not exist
+            VersionNotExists: Version does not exist
         """
         return {}
     
         """
         return {}
     
@@ -396,7 +414,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container/object does not exist
+            ItemNotExists: Container/object does not exist
         """
         return ''
     
         """
         return ''
     
@@ -413,7 +431,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container/object does not exist
+            ItemNotExists: Container/object does not exist
         """
         return {}
     
         """
         return {}
     
@@ -426,7 +444,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container/object does not exist
+            ItemNotExists: Container/object does not exist
             
             ValueError: Invalid users/groups in permissions
         """
             
             ValueError: Invalid users/groups in permissions
         """
@@ -438,7 +456,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container/object does not exist
+            ItemNotExists: Container/object does not exist
         """
         return None
     
         """
         return None
     
@@ -451,7 +469,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container/object does not exist
+            ItemNotExists: Container/object does not exist
         """
         return
     
         """
         return
     
@@ -461,9 +479,9 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container/object does not exist
+            ItemNotExists: Container/object does not exist
             
             
-            IndexError: Version does not exist
+            VersionNotExists: Version does not exist
         """
         return 0, []
     
         """
         return 0, []
     
@@ -482,7 +500,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container does not exist
+            ItemNotExists: Container does not exist
             
             ValueError: Invalid users/groups in permissions
             
             
             ValueError: Invalid users/groups in permissions
             
@@ -513,9 +531,9 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container/object does not exist
+            ItemNotExists: Container/object does not exist
             
             
-            IndexError: Version does not exist
+            VersionNotExists: Version does not exist
             
             ValueError: Invalid users/groups in permissions
             
             
             ValueError: Invalid users/groups in permissions
             
@@ -540,7 +558,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container/object does not exist
+            ItemNotExists: Container/object does not exist
             
             ValueError: Invalid users/groups in permissions
             
             
             ValueError: Invalid users/groups in permissions
             
@@ -557,7 +575,7 @@ class BaseBackend(object):
         Raises:
             NotAllowedError: Operation not permitted
             
         Raises:
             NotAllowedError: Operation not permitted
             
-            NameError: Container/object does not exist
+            ItemNotExists: Container/object does not exist
         """
         return
     
         """
         return
     
@@ -593,7 +611,7 @@ class BaseBackend(object):
         """Return a block's data.
         
         Raises:
         """Return a block's data.
         
         Raises:
-            NameError: Block does not exist
+            ItemNotExists: Block does not exist
         """
         return ''
     
         """
         return ''
     
index d1e3126..e2a55a7 100644 (file)
@@ -39,7 +39,8 @@ import logging
 import hashlib
 import binascii
 
 import hashlib
 import binascii
 
-from base import DEFAULT_QUOTA, DEFAULT_VERSIONING, NotAllowedError, QuotaError, BaseBackend
+from base import DEFAULT_QUOTA, DEFAULT_VERSIONING, NotAllowedError, QuotaError, BaseBackend, \
+    AccountExists, ContainerExists, AccountNotEmpty, ContainerNotEmpty, ItemNotExists, VersionNotExists
 
 # Stripped-down version of the HashMap class found in tools.
 class HashMap(list):
 
 # Stripped-down version of the HashMap class found in tools.
 class HashMap(list):
@@ -292,7 +293,7 @@ class ModularBackend(BaseBackend):
             raise NotAllowedError
         node = self.node.node_lookup(account)
         if node is not None:
             raise NotAllowedError
         node = self.node.node_lookup(account)
         if node is not None:
-            raise NameError('Account already exists')
+            raise AccountExists('Account already exists')
         if policy:
             self._check_policy(policy)
         node = self._put_path(user, self.ROOTNODE, account)
         if policy:
             self._check_policy(policy)
         node = self._put_path(user, self.ROOTNODE, account)
@@ -309,7 +310,7 @@ class ModularBackend(BaseBackend):
         if node is None:
             return
         if not self.node.node_remove(node):
         if node is None:
             return
         if not self.node.node_remove(node):
-            raise IndexError('Account is not empty')
+            raise AccountNotEmpty('Account is not empty')
         self.permissions.group_destroy(account)
     
     @backend_method
         self.permissions.group_destroy(account)
     
     @backend_method
@@ -434,7 +435,7 @@ class ModularBackend(BaseBackend):
         except NameError:
             pass
         else:
         except NameError:
             pass
         else:
-            raise NameError('Container already exists')
+            raise ContainerExists('Container already exists')
         if policy:
             self._check_policy(policy)
         path = '/'.join((account, container))
         if policy:
             self._check_policy(policy)
         path = '/'.join((account, container))
@@ -459,7 +460,7 @@ class ModularBackend(BaseBackend):
             return
         
         if self._get_statistics(node)[0] > 0:
             return
         
         if self._get_statistics(node)[0] > 0:
-            raise IndexError('Container is not empty')
+            raise ContainerNotEmpty('Container is not empty')
         hashes, size = self.node.node_purge_children(node, inf, CLUSTER_HISTORY)
         for h in hashes:
             self.store.map_delete(h)
         hashes, size = self.node.node_purge_children(node, inf, CLUSTER_HISTORY)
         for h in hashes:
             self.store.map_delete(h)
@@ -601,7 +602,7 @@ class ModularBackend(BaseBackend):
             except NameError: # Object may be deleted.
                 del_props = self.node.version_lookup(node, inf, CLUSTER_DELETED)
                 if del_props is None:
             except NameError: # Object may be deleted.
                 del_props = self.node.version_lookup(node, inf, CLUSTER_DELETED)
                 if del_props is None:
-                    raise NameError('Object does not exist')
+                    raise ItemNotExists('Object does not exist')
                 modified = del_props[self.MTIME]
         
         meta = {}
                 modified = del_props[self.MTIME]
         
         meta = {}
@@ -919,7 +920,7 @@ class ModularBackend(BaseBackend):
         logger.debug("get_block: %s", hash)
         block = self.store.block_get(binascii.unhexlify(hash))
         if not block:
         logger.debug("get_block: %s", hash)
         block = self.store.block_get(binascii.unhexlify(hash))
         if not block:
-            raise NameError('Block does not exist')
+            raise ItemNotExists('Block does not exist')
         return block
     
     @backend_method(autocommit=0)
         return block
     
     @backend_method(autocommit=0)
@@ -966,20 +967,18 @@ class ModularBackend(BaseBackend):
         path = '/'.join((account, container))
         node = self.node.node_lookup(path)
         if node is None:
         path = '/'.join((account, container))
         node = self.node.node_lookup(path)
         if node is None:
-            raise NameError('Container does not exist')
+            raise ItemNotExists('Container does not exist')
         return path, node
     
     def _lookup_object(self, account, container, name):
         path = '/'.join((account, container, name))
         node = self.node.node_lookup(path)
         if node is None:
         return path, node
     
     def _lookup_object(self, account, container, name):
         path = '/'.join((account, container, name))
         node = self.node.node_lookup(path)
         if node is None:
-            raise NameError('Object does not exist')
+            raise ItemNotExists('Object does not exist')
         return path, node
     
     def _lookup_objects(self, paths):
         return path, node
     
     def _lookup_objects(self, paths):
-       nodes = self.node.node_lookup_bulk(paths)
-        if nodes is None:
-            raise NameError('Object does not exist')
+        nodes = self.node.node_lookup_bulk(paths)
         return paths, nodes
     
     def _get_properties(self, node, until=None):
         return paths, nodes
     
     def _get_properties(self, node, until=None):
@@ -990,7 +989,7 @@ class ModularBackend(BaseBackend):
         if props is None and until is not None:
             props = self.node.version_lookup(node, before, CLUSTER_HISTORY)
         if props is None:
         if props is None and until is not None:
             props = self.node.version_lookup(node, before, CLUSTER_HISTORY)
         if props is None:
-            raise NameError('Path does not exist')
+            raise ItemNotExists('Path does not exist')
         return props
     
     def _get_statistics(self, node, until=None):
         return props
     
     def _get_statistics(self, node, until=None):
@@ -1008,31 +1007,19 @@ class ModularBackend(BaseBackend):
         if version is None:
             props = self.node.version_lookup(node, inf, CLUSTER_NORMAL)
             if props is None:
         if version is None:
             props = self.node.version_lookup(node, inf, CLUSTER_NORMAL)
             if props is None:
-                raise NameError('Object does not exist')
+                raise ItemNotExists('Object does not exist')
         else:
             try:
                 version = int(version)
             except ValueError:
         else:
             try:
                 version = int(version)
             except ValueError:
-                raise IndexError('Version does not exist')
+                raise VersionNotExists('Version does not exist')
             props = self.node.version_get_properties(version)
             if props is None or props[self.CLUSTER] == CLUSTER_DELETED:
             props = self.node.version_get_properties(version)
             if props is None or props[self.CLUSTER] == CLUSTER_DELETED:
-                raise IndexError('Version does not exist')
+                raise VersionNotExists('Version does not exist')
         return props
 
         return props
 
-    def _get_versions(self, nodes, version=None):
-        if version is None:
-            props = self.node.version_lookup_bulk(nodes, inf, CLUSTER_NORMAL)
-            if not props:
-                raise NameError('Object does not exist')
-        else:
-            try:
-                version = int(version)
-            except ValueError:
-                raise IndexError('Version does not exist')
-            props = self.node.version_get_properties(version)
-            if props is None or props[self.CLUSTER] == CLUSTER_DELETED:
-                raise IndexError('Version does not exist')
-        return props
+    def _get_versions(self, nodes):
+        return self.node.version_lookup_bulk(nodes, inf, CLUSTER_NORMAL)
     
     def _put_version_duplicate(self, user, node, src_node=None, size=None, type=None, hash=None, checksum=None, cluster=CLUSTER_NORMAL, is_copy=False):
         """Create a new version of the node."""
     
     def _put_version_duplicate(self, user, node, src_node=None, size=None, type=None, hash=None, checksum=None, cluster=CLUSTER_NORMAL, is_copy=False):
         """Create a new version of the node."""