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
Example #2
0
    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
Example #3
0
    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
Example #4
0
    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
Example #5
0
    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
Example #6
0
 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)
Example #7
0
 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
Example #8
0
 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 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
Example #10
0
 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
Example #11
0
 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
Example #12
0
 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
Example #13
0
    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
Example #14
0
    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
Example #15
0
 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
Example #16
0
 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
Example #17
0
    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)
Example #18
0
    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
Example #19
0
    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
Example #20
0
    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
Example #21
0
    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
Example #22
0
    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
Example #23
0
    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
Example #25
0
    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
Example #27
0
    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
Example #28
0
    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
Example #29
0
    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
Example #30
0
 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