Report remaining bytes. Enforce account quota when setting container limits.
authorAntony Chazapis <chazapis@gmail.com>
Tue, 11 Oct 2011 13:15:42 +0000 (16:15 +0300)
committerAntony Chazapis <chazapis@gmail.com>
Tue, 11 Oct 2011 13:15:42 +0000 (16:15 +0300)
Refs #1165

docs/source/devguide.rst
pithos/api/faults.py
pithos/api/functions.py
pithos/api/util.py

index c69387f..c6ccebe 100644 (file)
@@ -221,7 +221,7 @@ Reply Header Name           Value
 X-Account-Container-Count   The total number of containers
 X-Account-Object-Count      The total number of objects (**TBD**)
 X-Account-Bytes-Used        The total number of bytes stored
-X-Account-Bytes-Remaining   The total number of bytes remaining (**TBD**)
+X-Account-Bytes-Remaining   The total number of bytes remaining
 X-Account-Last-Login        The last login (**TBD**)
 X-Account-Until-Timestamp   The last account modification date until the timestamp provided
 X-Account-Group-*           Optional user defined groups
index d5c3795..f9dd1d1 100644 (file)
@@ -66,6 +66,9 @@ class LengthRequired(Fault):
 class PreconditionFailed(Fault):
     code = 412
 
+class RequestEntityTooLarge(Fault):
+    code = 413
+
 class RangeNotSatisfiable(Fault):
     code = 416
 
index 947014b..595b570 100644 (file)
@@ -192,7 +192,7 @@ def account_meta(request, v_account):
     validate_modification_preconditions(request, meta)
     
     response = HttpResponse(status=204)
-    put_account_headers(response, meta, groups)
+    put_account_headers(response, request.quota, meta, groups)
     return response
 
 @api_method('POST')
@@ -240,7 +240,7 @@ def container_list(request, v_account):
     validate_modification_preconditions(request, meta)
     
     response = HttpResponse()
-    put_account_headers(response, meta, groups)
+    put_account_headers(response, request.quota, meta, groups)
     
     marker = request.GET.get('marker')
     limit = get_int_parameter(request.GET.get('limit'))
@@ -329,10 +329,14 @@ def container_create(request, v_account, v_container):
     #                       badRequest (400)
     
     meta, policy = get_container_headers(request)
+    try:
+        if policy and int(policy.get('quota', 0)) > request.quota:
+            policy['quota'] = request.quota
+    except:
+        raise BadRequest('Invalid quota header')
     
     try:
-        request.backend.put_container(request.user, v_account, v_container,
-                                        policy)
+        request.backend.put_container(request.user, v_account, v_container, policy)
         ret = 201
     except NotAllowedError:
         raise Unauthorized('Access denied')
@@ -376,6 +380,11 @@ def container_update(request, v_account, v_container):
         replace = False
     if policy:
         try:
+            if int(policy.get('quota', 0)) > request.quota:
+                policy['quota'] = request.quota
+        except:
+            raise BadRequest('Invalid quota header')
+        try:
             request.backend.update_container_policy(request.user, v_account,
                                                 v_container, policy, replace)
         except NotAllowedError:
index a00e2ca..0bb066b 100644 (file)
@@ -114,11 +114,13 @@ def get_account_headers(request):
             groups[n].remove('')
     return meta, groups
 
-def put_account_headers(response, meta, groups):
+def put_account_headers(response, quota, meta, groups):
     if 'count' in meta:
         response['X-Account-Container-Count'] = meta['count']
     if 'bytes' in meta:
         response['X-Account-Bytes-Used'] = meta['bytes']
+        if quota:
+            response['X-Account-Bytes-Remaining'] = quota - meta['bytes']
     response['Last-Modified'] = http_date(int(meta['modified']))
     for k in [x for x in meta.keys() if x.startswith('X-Account-Meta-')]:
         response[smart_str(k, strings_only=True)] = smart_str(meta[k], strings_only=True)
@@ -285,7 +287,6 @@ def copy_or_move_object(request, src_account, src_container, src_name, dest_acco
     """Copy or move an object."""
     
     meta, permissions, public = get_object_headers(request)
-    print '---', meta, permissions, public
     src_version = request.META.get('HTTP_X_SOURCE_VERSION')
     try:
         if move: