From 7efc9f8670f263196536ed6be5db2caa12bb36f1 Mon Sep 17 00:00:00 2001 From: Sofia Papagiannaki Date: Thu, 28 Jun 2012 15:51:01 +0300 Subject: [PATCH] change backend to raise custom exceptions --- snf-pithos-app/pithos/api/functions.py | 69 ++++++++++++------------ snf-pithos-app/pithos/api/util.py | 8 +-- snf-pithos-backend/pithos/backends/base.py | 70 ++++++++++++++++--------- snf-pithos-backend/pithos/backends/modular.py | 47 ++++++----------- 4 files changed, 100 insertions(+), 94 deletions(-) diff --git a/snf-pithos-app/pithos/api/functions.py b/snf-pithos-app/pithos/api/functions.py index 65e56d1..37df0db 100644 --- a/snf-pithos-app/pithos/api/functions.py +++ b/snf-pithos-app/pithos/api/functions.py @@ -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 -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 @@ -330,7 +331,7 @@ def container_meta(request, v_account, v_container): v_container) except NotAllowedError: raise Forbidden('Not allowed') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: raise ItemNotFound('Container does not exist') - except IndexError: + except ContainerNotEmpty: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: raise ItemNotFound('Object does not exist') - except IndexError: + except VersionNotExists: 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') - except NameError: + except ItemNotExists: raise ItemNotFound('Object does not exist') - except IndexError: + except VersionNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: raise ItemNotFound('Object does not exist') - except IndexError: + except VersionNotExists: 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') - except NameError: + except ItemNotExists: raise ItemNotFound('Object does not exist') - except IndexError: + except VersionNotExists: 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)) - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except (NameError, IndexError): + except (ItemNotExists, VersionNotExists): 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: 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') - except NameError: + except ItemNotExists: raise ItemNotFound('Object does not exist') return HttpResponse(status=204) diff --git a/snf-pithos-app/pithos/api/util.py b/snf-pithos-app/pithos/api/util.py index c3a8fd8..0055d9a 100644 --- a/snf-pithos-app/pithos/api/util.py +++ b/snf-pithos-app/pithos/api/util.py @@ -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 -from pithos.backends.base import NotAllowedError, QuotaError +from pithos.backends.base import NotAllowedError, QuotaError, ItemNotExists, VersionNotExists 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') - except (NameError, IndexError): + except (ItemNotExists, VersionNotExists): 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') - except NameError: + except ItemNotExists: 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) - except NameError: + except ItemNotExists: raise ItemNotFound('Block does not exist') # Get the data from the block. diff --git a/snf-pithos-backend/pithos/backends/base.py b/snf-pithos-backend/pithos/backends/base.py index 0d4e198..9a68362 100644 --- a/snf-pithos-backend/pithos/backends/base.py +++ b/snf-pithos-backend/pithos/backends/base.py @@ -42,6 +42,24 @@ class NotAllowedError(Exception): 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. @@ -165,7 +183,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - IndexError: Account is not empty + AccountNotEmpty: Account is not empty """ return @@ -193,7 +211,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container does not exist + ItemNotExists: Container does not exist """ return [] @@ -214,7 +232,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container does not exist + ItemNotExists: Container does not exist """ return {} @@ -231,7 +249,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container does not exist + ItemNotExists: Container does not exist """ return @@ -246,7 +264,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container does not exist + ItemNotExists: Container does not exist """ return {} @@ -256,7 +274,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container does not exist + ItemNotExists: Container does not exist ValueError: Invalid policy defined """ @@ -268,7 +286,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container already exists + ContainerExists: Container already exists ValueError: Invalid policy defined """ @@ -280,9 +298,9 @@ class BaseBackend(object): 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 @@ -321,7 +339,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container does not exist + ItemNotExists: Container does not exist """ return [] @@ -334,7 +352,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container does not exist + ItemNotExists: Container does not exist """ return [] @@ -377,9 +395,9 @@ class BaseBackend(object): 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 {} @@ -396,7 +414,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container/object does not exist + ItemNotExists: Container/object does not exist """ return '' @@ -413,7 +431,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container/object does not exist + ItemNotExists: Container/object does not exist """ return {} @@ -426,7 +444,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container/object does not exist + ItemNotExists: Container/object does not exist ValueError: Invalid users/groups in permissions """ @@ -438,7 +456,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container/object does not exist + ItemNotExists: Container/object does not exist """ return None @@ -451,7 +469,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container/object does not exist + ItemNotExists: Container/object does not exist """ return @@ -461,9 +479,9 @@ class BaseBackend(object): 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, [] @@ -482,7 +500,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container does not exist + ItemNotExists: Container does not exist ValueError: Invalid users/groups in permissions @@ -513,9 +531,9 @@ class BaseBackend(object): 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 @@ -540,7 +558,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container/object does not exist + ItemNotExists: Container/object does not exist ValueError: Invalid users/groups in permissions @@ -557,7 +575,7 @@ class BaseBackend(object): Raises: NotAllowedError: Operation not permitted - NameError: Container/object does not exist + ItemNotExists: Container/object does not exist """ return @@ -593,7 +611,7 @@ class BaseBackend(object): """Return a block's data. Raises: - NameError: Block does not exist + ItemNotExists: Block does not exist """ return '' diff --git a/snf-pithos-backend/pithos/backends/modular.py b/snf-pithos-backend/pithos/backends/modular.py index d1e3126..e2a55a7 100644 --- a/snf-pithos-backend/pithos/backends/modular.py +++ b/snf-pithos-backend/pithos/backends/modular.py @@ -39,7 +39,8 @@ import logging 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): @@ -292,7 +293,7 @@ class ModularBackend(BaseBackend): 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) @@ -309,7 +310,7 @@ class ModularBackend(BaseBackend): 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 @@ -434,7 +435,7 @@ class ModularBackend(BaseBackend): except NameError: pass else: - raise NameError('Container already exists') + raise ContainerExists('Container already exists') 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: - 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) @@ -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: - raise NameError('Object does not exist') + raise ItemNotExists('Object does not exist') 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: - raise NameError('Block does not exist') + raise ItemNotExists('Block does not exist') 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: - 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: - raise NameError('Object does not exist') + raise ItemNotExists('Object does not exist') 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): @@ -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: - raise NameError('Path does not exist') + raise ItemNotExists('Path does not exist') 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: - raise NameError('Object does not exist') + raise ItemNotExists('Object does not exist') 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: - raise IndexError('Version does not exist') + raise VersionNotExists('Version does not exist') 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.""" -- 1.7.10.4