-from pithos.api.settings import (BACKEND_DB_MODULE, BACKEND_DB_CONNECTION,
- BACKEND_BLOCK_MODULE, BACKEND_BLOCK_PATH,
- BACKEND_BLOCK_UMASK,
- BACKEND_QUEUE_MODULE, BACKEND_QUEUE_HOSTS,
- BACKEND_QUEUE_EXCHANGE,
- BACKEND_QUOTA, BACKEND_VERSIONING)
-from pithos.backends import connect_backend
-from pithos.api.util import hashmap_md5
+# from pithos.api.settings import (BACKEND_DB_MODULE, BACKEND_DB_CONNECTION,
+# BACKEND_BLOCK_MODULE, BACKEND_BLOCK_PATH,
+# BACKEND_BLOCK_UMASK,
+# BACKEND_QUEUE_MODULE, BACKEND_QUEUE_HOSTS,
+# BACKEND_QUEUE_EXCHANGE,
+# BACKEND_QUOTA, BACKEND_VERSIONING,
+# BACKEND_FREE_VERSIONING)
+from pithos.api.settings import (BACKEND_QUOTA, BACKEND_VERSIONING)
+
+#from pithos.backends import connect_backend
+from pithos.api.util import hashmap_md5, get_backend
from django.core.mail import send_mail
from django.utils.translation import ugettext as _
if m['resource'] != 'object' or m['details']['action'] != 'object update':
return
- backend = connect_backend(db_module=BACKEND_DB_MODULE,
- db_connection=BACKEND_DB_CONNECTION,
- block_module=BACKEND_BLOCK_MODULE,
- block_path=BACKEND_BLOCK_PATH,
- block_umask=BACKEND_BLOCK_UMASK,
- queue_module=BACKEND_QUEUE_MODULE,
- queue_hosts=BACKEND_QUEUE_HOSTS,
- queue_exchange=BACKEND_QUEUE_EXHANGE)
+# backend = connect_backend(db_module=BACKEND_DB_MODULE,
+# db_connection=BACKEND_DB_CONNECTION,
+# block_module=BACKEND_BLOCK_MODULE,
+# block_path=BACKEND_BLOCK_PATH,
+# block_umask=BACKEND_BLOCK_UMASK,
+# queue_module=BACKEND_QUEUE_MODULE,
+# queue_hosts=BACKEND_QUEUE_HOSTS,
+# queue_exchange=BACKEND_QUEUE_EXHANGE
+# free_versioning=BACKEND_FREE_VERSIONING)
+ backend = get_backend()
backend.default_policy['quota'] = BACKEND_QUOTA
backend.default_policy['versioning'] = BACKEND_VERSIONING
def __init__(self, db_module=None, db_connection=None,
block_module=None, block_path=None, block_umask=None,
queue_module=None, queue_hosts=None,
- queue_exchange=None):
+ queue_exchange=None,
+ free_versioning=True):
db_module = db_module or DEFAULT_DB_MODULE
db_connection = db_connection or DEFAULT_DB_CONNECTION
block_module = block_module or DEFAULT_BLOCK_MODULE
#queue_module = queue_module or DEFAULT_QUEUE_MODULE
#queue_hosts = queue_hosts or DEFAULT_QUEUE_HOSTS
#queue_exchange = queue_exchange or DEFAULT_QUEUE_EXCHANGE
-
+
self.hash_algorithm = 'sha256'
self.block_size = 4 * 1024 * 1024 # 4MB
+ self.free_versioning = free_versioning
self.default_policy = {'quota': DEFAULT_QUOTA,
'versioning': DEFAULT_VERSIONING}
if queue_module and queue_hosts:
self.queue_module = load_module(queue_module)
params = {'hosts': queue_hosts,
- 'exchange': queue_exchange,
+ 'exchange': queue_exchange,
'client_id': QUEUE_CLIENT_ID}
self.queue = self.queue_module.Queue(**params)
else:
self.store.map_delete(h)
self.node.node_purge_children(node, until, CLUSTER_DELETED)
self._report_size_change(user, account, -size,
- {'action':'container purge', 'path': path,
- 'versions': ','.join(str(i) for i in serials)})
+ {'action':'container purge', 'path': path,
+ 'versions': ','.join(str(i) for i in serials)})
return
if not delimiter:
self.node.node_purge_children(node, inf, CLUSTER_DELETED)
self.node.node_remove(node)
self._report_size_change(user, account, -size,
- {'action': 'container delete',
- 'path': path,
- 'versions': ','.join(str(i) for i in serials)})
+ {'action': 'container delete',
+ 'path': path,
+ 'versions': ','.join(str(i) for i in serials)})
else:
- # remove only contents
+ # remove only contents
src_names = self._list_objects_no_limit(user, account, container, prefix='', delimiter=None, virtual=False, domain=None, keys=[], shared=False, until=None, size_range=None, all_props=True, public=False)
paths = []
for t in src_names:
src_version_id, dest_version_id = self._put_version_duplicate(user, node, size=0, type='', hash=None, checksum='', cluster=CLUSTER_DELETED)
del_size = self._apply_versioning(
account, container, src_version_id)
- if del_size:
- self._report_size_change(user, account, -del_size,
- {'action': 'object delete',
- 'path': path,
- 'versions': ','.join([str(dest_version_id)])})
+ self._report_size_change(
+ user, account, -del_size, {
+ 'action': 'object delete',
+ 'path': path,
+ 'versions': ','.join([str(dest_version_id)])
+ }
+ )
self._report_object_change(
user, account, path, details={'action': 'object delete'})
paths.append(path)
self._put_metadata_duplicate(
src_version_id, dest_version_id, domain, meta, replace_meta)
- # Check quota.
del_size = self._apply_versioning(account, container, pre_version_id)
size_delta = size - del_size
- if size_delta > 0:
- account_quota = long(self._get_policy(account_node)['quota'])
- container_quota = long(self._get_policy(container_node)['quota'])
- if (account_quota > 0 and self._get_statistics(account_node)[1] + size_delta > account_quota) or \
- (container_quota > 0 and self._get_statistics(container_node)[1] + size_delta > container_quota):
- # This must be executed in a transaction, so the version is never created if it fails.
- raise QuotaError
+# # Check quota.
+# if size_delta > 0:
+# account_quota = long(self._get_policy(account_node)['quota'])
+# container_quota = long(self._get_policy(container_node)['quota'])
+# if (account_quota > 0 and self._get_statistics(account_node)[1] + size_delta > account_quota) or \
+# (container_quota > 0 and self._get_statistics(container_node)[1] + size_delta > container_quota):
+# # This must be executed in a transaction, so the version is never created if it fails.
+# raise QuotaError
self._report_size_change(user, account, size_delta,
- {'action': 'object update', 'path': path,
- 'versions': ','.join([str(dest_version_id)])})
+ {'action': 'object update', 'path': path,
+ 'versions': ','.join([str(dest_version_id)])})
if permissions is not None:
self.permissions.access_set(path, permissions)
except NameError:
self.permissions.access_clear(path)
self._report_size_change(user, account, -size,
- {'action': 'object purge', 'path': path,
- 'versions': ','.join(str(i) for i in serials)})
+ {'action': 'object purge', 'path': path,
+ 'versions': ','.join(str(i) for i in serials)})
return
path, node = self._lookup_object(account, container, name)
src_version_id, dest_version_id = self._put_version_duplicate(user, node, size=0, type='', hash=None, checksum='', cluster=CLUSTER_DELETED)
del_size = self._apply_versioning(account, container, src_version_id)
- if del_size:
- self._report_size_change(user, account, -del_size,
- {'action': 'object delete', 'path': path,
- 'versions': ','.join([str(dest_version_id)])})
+ self._report_size_change(user, account, -del_size,
+ {'action': 'object delete', 'path': path,
+ 'versions': ','.join([str(dest_version_id)])})
self._report_object_change(
user, account, path, details={'action': 'object delete'})
self.permissions.access_clear(path)
src_version_id, dest_version_id = self._put_version_duplicate(user, node, size=0, type='', hash=None, checksum='', cluster=CLUSTER_DELETED)
del_size = self._apply_versioning(
account, container, src_version_id)
- if del_size:
- self._report_size_change(user, account, -del_size,
- {'action': 'object delete',
- 'path': path,
- 'versions': ','.join([str(dest_version_id)])})
+ self._report_size_change(user, account, -del_size,
+ {'action': 'object delete',
+ 'path': path,
+ 'versions': ','.join([str(dest_version_id)])})
self._report_object_change(
user, account, path, details={'action': 'object delete'})
paths.append(path)
logger.debug(
"_report_size_change: %s %s %s %s", user, account, size, details)
self.messages.append((QUEUE_MESSAGE_KEY_PREFIX % ('resource.diskspace',),
- account, QUEUE_INSTANCE_ID, 'diskspace',
- float(size), details))
+ account, QUEUE_INSTANCE_ID, 'diskspace',
+ float(size), details))
def _report_object_change(self, user, account, path, details={}):
details.update({'user': user})
logger.debug("_report_object_change: %s %s %s %s", user,
account, path, details)
self.messages.append((QUEUE_MESSAGE_KEY_PREFIX % ('object',),
- account, QUEUE_INSTANCE_ID, 'object', path, details))
+ account, QUEUE_INSTANCE_ID, 'object', path, details))
def _report_sharing_change(self, user, account, path, details={}):
logger.debug("_report_permissions_change: %s %s %s %s",
user, account, path, details)
details.update({'user': user})
self.messages.append((QUEUE_MESSAGE_KEY_PREFIX % ('sharing',),
- account, QUEUE_INSTANCE_ID, 'sharing', path, details))
+ account, QUEUE_INSTANCE_ID, 'sharing', path, details))
# Policy functions.
return 0
path, node = self._lookup_container(account, container)
versioning = self._get_policy(node)['versioning']
- if versioning != 'auto':
+ if versioning != 'auto' or self.free_versioning:
hash, size = self.node.version_remove(version_id)
self.store.map_delete(hash)
return size