def add_quota_used(self, quota_info, content_uploaded): quota_limit = long(quota_info['quota_limit']) quota_used = long(quota_info['quota_used']) quota_used_afer_put = quota_used + long(content_uploaded) quota_used_after_put = quota_used + content_uploaded if quota_used_after_put > quota_limit: self.app.logger.error("StackSync Quota: Quota exceeded. Available space: "+str(quota_limit-quota_used)) return create_error_response(413, 'Upload exceeds quota.') #Notify quota_server for the new quota_used value. self.app.logger.info('StackSync Quota: add_quota_used') response = self.rpc_server.XmlRpcQuotaHandler.updateAvailableQuota(quota_info['user'], str(quota_used_after_put)) response = create_response(response, status_code=200) if not is_valid_status(response.status_int): self.app.logger.error("StackSync Quota: Error updating quota used") return response return self.app
def __call__(self, req): self.app.logger.info('StackSync Quota start') self.app.logger.info(req.environ) #Check if is a call to object _, _, container, swift_object = split_path(req.path, 0, 4, True) if not swift_object: return self.app #check if is an authorize reqeuest container_info = get_container_info(req.environ, self.app, swift_source='CQ') response = self.authorize(req, container_info) if response: return response #check if is a valid request if not self.valid_request(req): # We only want to process PUT and DELETE requests return self.app quota_info = self.rpc_server.XmlRpcQuotaHandler.getAvailableQuota(container) response = create_response(quota_info, status_code=200) if not is_valid_status(response.status_int): if response.status_int == 404: # User not found. No StackSync user return self.app else: self.app.logger.error("StackSync Quota: status code: %s. body: %s", str(response.status_int), str(response.body)) return response quota_info = json.loads(quota_info) if req.method == 'PUT': return self.add_quota_used(quota_info, long(req.environ["CONTENT_LENGTH"])) if req.method == 'DELETE': return self.subtract_quota_used(quota_info, req.environ)
def subtract_quota_used(self, quota_info, env): # HEAD to swift resource to know the content length quota_limit = long(quota_info['quota_limit']) quota_used = long(quota_info['quota_used']) object_info = get_object_info(env, self.app, env['PATH_INFO']) if not object_info or not object_info['length']: content_to_delete = 0 else: content_to_delete = long(object_info['length']) quota_used_after_delete = quota_used - content_to_delete #send new quota to quota server self.app.logger.info('StackSync Quota: subtract_quota_used') response = self.rpc_server.XmlRpcQuotaHandler.updateAvailableQuota(quota_info['user'], str(quota_used_after_delete)) response = create_response(response, status_code=200) if not is_valid_status(response.status_int): self.app.logger.error("StackSync Quota: Error updating quota used") return response return self.app