def get_bucket(self, bucket, validate=True): """ Retrieve a bucket by name. Keyword arguments: bucket - The name of the bucket validate - If ``True``, the function will try to verify the bucket exists on the service-side. (Default: ``True``) """ if not validate: return Bucket(self, bucket) response = self.make_request("HEAD", bucket) if response.status == 200: return Bucket(self, bucket) elif response.status == 401: err = get_response_error(response) err.code = "invalid_access_key_id" err.message = "Request not authenticated, Access Key ID is either " \ "missing or invalid." raise err elif response.status == 403: err = get_response_error(response) err.code = "permission_denied" err.message = "You don't have enough permission to accomplish " \ "this request." raise err elif response.status == 404: err = get_response_error(response) err.code = "bucket_not_exists" err.message = "The bucket you are accessing doesn't exist." raise err else: err = get_response_error(response) raise err
def list(self, prefix=None, delimiter=None, marker=None, limit=None): """ List objects of the bucket. Keyword arguments: prefix - Limits the response to keys that begin with the specified prefix delimiter - A character you use to group keys marker - Specifies the key to start with when listing objects limit - The count of objects that the request returns """ params = {} if prefix: params["prefix"] = prefix if delimiter: params["delimiter"] = delimiter if marker: params["marker"] = marker if limit: params["limit"] = str(limit) response = self.connection.make_request("GET", self.name, params=params) if response.status == 200: resp = json.loads(response.read()) result_set = [] for k in resp["keys"]: key = Key(self, k["key"]) key.content_type = k["mime_type"] result_set.append(key) return result_set else: err = get_response_error(response) raise err
def complete_multipart_upload(self, key_name, upload_id, parts): """Complete the multipart upload. Keyword arguments: key_name - The object name upload_id - ID for the initiated multipart upload parts - The list of the multiparts which need to be combined """ params = { "upload_id": upload_id, } object_parts = [] #for part in sorted(parts, key=lambda x: x.part_number): for part in parts: object_parts.append({"part_number": part.part_number}) if not object_parts: return False body = {"object_parts": object_parts} response = self.connection.make_request("POST", self.name, key_name, data=json.dumps(body), params=params) if response.status == 201: return True else: err = get_response_error(response) raise err
def complete_multipart_upload(self, key_name, upload_id, parts): """Complete the multipart upload. Keyword arguments: key_name - The object name upload_id - ID for the initiated multipart upload parts - The list of the multiparts which need to be combined """ params = { "upload_id": upload_id, } object_parts = [] #for part in sorted(parts, key=lambda x: x.part_number): for part in parts: object_parts.append({"part_number": part.part_number}) if not object_parts: return False body = {"object_parts": object_parts} response = self.connection.make_request( "POST", self.name, key_name, data=json.dumps(body), params=params) if response.status == 201: return True else: err = get_response_error(response) raise err
def delete(self): """ Delete the bucket """ response = self.connection.make_request("DELETE", self.name, num_retries=6) if response.status == 204: return True else: raise get_response_error(response)
def open_read(self, headers=None): """ Open this key for reading. """ if self.resp is None: self.resp = self.bucket.connection.make_request( "GET", self.bucket.name, self.name, headers=headers) if self.resp.status != 200: err = get_response_error(self.resp) raise err
def get_all_buckets(self, zone=""): if zone: headers = {"Location": zone} else: headers = {} response = self.make_request("GET", headers=headers) if response.status == 200: return json.loads(response.read()) else: err = get_response_error(response) raise err
def get_acl(self): """ Retrieve the bucket access control list. """ params = {"acl": None} response = self.connection.make_request("GET", self.name, params=params) if response.status == 200: resp = json.loads(response.read()) return resp else: err = get_response_error(response) raise err
def stats(self): """ Retrieve the bucket meta information. """ params = {"stats": None} response = self.connection.make_request("GET", self.name, params=params) if response.status == 200: resp = json.loads(response.read()) return resp else: err = get_response_error(response) raise err
def exists(self): """ Check whether the object exists or not. """ response = self.bucket.connection.make_request("HEAD", self.bucket.name, self.name) if response.status == 200: return True elif response.status == 404: return False else: err = get_response_error(response) raise err
def delete_key(self, key_name): """ Deleted the particular object by object name. Keyword arguments: key_name - The name of the object """ response = self.connection.make_request("DELETE", self.name, key_name) if response.status == 204: return True else: err = get_response_error(response) raise err
def create_bucket(self, bucket, zone=Zone.DEFAULT): """ Create a new bucket. Keyword arguments: bucket - The name of the bucket zone - The zone at which bucket and its objects will locate. (Default: follow the service-side rule) """ headers = {"Location": zone} response = self.make_request("PUT", bucket, headers=headers) if response.status in [200, 201]: return Bucket(self, bucket) else: raise get_response_error(response)
def get_key(self, key_name, validate=True): """ Retrieves an object by name. Returns: An instance of a Key object or None Keyword arguments: key_name - The name of the bucket validate - If True, the function will try to verify the object exists on the service-side (Default: True) """ if not validate: return Key(self, key_name) response = self.connection.make_request("HEAD", self.name, key_name) if response.status == 200: return Key(self, key_name) elif response.status == 401: err = get_response_error(response) err.code = "invalid_access_key_id" err.message = "Request not authenticated, Access Key ID is either " \ "missing or invalid." raise err elif response.status == 403: err = get_response_error(response) err.code = "permission_denied" err.message = "You don't have enough permission to accomplish " \ "this request." raise err elif response.status == 404: err = get_response_error(response) err.code = "object_not_exists" err.message = "The object you are accessing doesn't exist." raise err else: err = get_response_error(response) raise err
def set_acl(self, acls): """ Set the bucket access control list. Keyword arguments: acls - The list of ACL infomation """ params = {"acl": None} data = json.dumps(acls) response = self.connection.make_request("PUT", self.name, params=params, data=data) if response.status == 200: return True else: err = get_response_error(response) raise err
def cancel_multipart_upload(self, key_name, upload_id): """Abort the multipart upload. Keyword arguments: key_name - The object name upload_id - ID for the initiated multipart upload """ params = { "upload_id": upload_id, } response = self.connection.make_request( "DELETE", self.name, key_name, params=params) if response.status == 204: return True else: err = get_response_error(response) raise err
def send_file(self, fp, content_type=None): """ Upload a file to a key into the bucket. Keyword arguments: content_type - The content type of the object """ headers = { "Content-Type": content_type or self.content_type } response = self.bucket.connection.make_request( "PUT", self.bucket.name, self.name, data=fp, headers=headers) if response.status == 201: self.close() return True else: err = get_response_error(response) raise err
def upload_part_from_file(self, fp, part_number): """ Upload multipart from a file Keyword arguments: fp - a file-like object part_number - The number of the multipart """ params = { "upload_id": self.upload_id, "part_number": str(part_number), } response = self.bucket.connection.make_request( "PUT", self.bucket.name, self.key_name, data=fp, params=params) if response.status == 201: part = Part(self.bucket.name, self.key_name, part_number) return part else: err = get_response_error(response) raise err
def cancel_multipart_upload(self, key_name, upload_id): """Abort the multipart upload. Keyword arguments: key_name - The object name upload_id - ID for the initiated multipart upload """ params = { "upload_id": upload_id, } response = self.connection.make_request("DELETE", self.name, key_name, params=params) if response.status == 204: return True else: err = get_response_error(response) raise err
def get_all_parts(self): """ Retrieve all multiparts of an object that uploaded. """ params = { "upload_id": self.upload_id, } response = self.bucket.connection.make_request( "GET", self.bucket.name, self.key_name, params=params) if response.status == 200: parts = [] resp = json.loads(response.read()) for item in resp["object_parts"]: part = Part(self.bucket.name, self.key_name, item["part_number"]) part.size = item["size"] part.created = item["created"] parts.append(part) return parts else: err = get_response_error(response) raise err
def initiate_multipart_upload(self, key_name, content_type=None): """Initiate a multipart upload. Returns: An instance of MultiPartUpload Keyword arguments: key_name - The object name content_type - The content type of the object """ params = {"uploads": None} headers = { "Content-Type": content_type or self.DefaultContentType } response = self.connection.make_request( "POST", self.name, key_name, headers=headers, params=params) if response.status == 200: resp = json.loads(response.read()) handler = MultiPartUpload(self, key_name, resp["upload_id"]) return handler else: err = get_response_error(response) raise err
def upload_part_from_file(self, fp, part_number): """ Upload multipart from a file Keyword arguments: fp - a file-like object part_number - The number of the multipart """ params = { "upload_id": self.upload_id, "part_number": str(part_number), } response = self.bucket.connection.make_request("PUT", self.bucket.name, self.key_name, data=fp, params=params) if response.status == 201: part = Part(self.bucket.name, self.key_name, part_number) return part else: err = get_response_error(response) raise err
def initiate_multipart_upload(self, key_name, content_type=None): """Initiate a multipart upload. Returns: An instance of MultiPartUpload Keyword arguments: key_name - The object name content_type - The content type of the object """ params = {"uploads": None} headers = {"Content-Type": content_type or self.DefaultContentType} response = self.connection.make_request("POST", self.name, key_name, headers=headers, params=params) if response.status == 200: resp = json.loads(response.read()) handler = MultiPartUpload(self, key_name, resp["upload_id"]) return handler else: err = get_response_error(response) raise err
def get_all_parts(self): """ Retrieve all multiparts of an object that uploaded. """ params = { "upload_id": self.upload_id, } response = self.bucket.connection.make_request("GET", self.bucket.name, self.key_name, params=params) if response.status == 200: parts = [] resp = json.loads(response.read()) for item in resp["object_parts"]: part = Part(self.bucket.name, self.key_name, item["part_number"]) part.size = item["size"] part.created = item["created"] parts.append(part) return parts else: err = get_response_error(response) raise err