def get(self, pfn, dest, transfer_timeout=None): """ Provides access to files stored inside connected the RSE. :param path: Physical file name of requested file :param dest: Name and path of the files when stored at the client :param transfer_timeout: Transfer timeout (in seconds) - dummy :raises DestinationNotAccessible: if the destination storage was not accessible. :raises ServiceUnavailable: if some generic error occured in the library. :raises SourceNotFound: if the source file was not found on the referred storage. """ tf = None try: tf = open(dest, 'wb') self.__s3.object_get(S3Uri(pfn), tf) # pylint: disable=no-value-for-parameter tf.close() except S3Error as e: tf.close() call(['rm', dest]) # Must be changed if resume will be supported if e.status in [404, 403]: raise exception.SourceNotFound(e) else: raise exception.ServiceUnavailable(e) except IOError as e: if e.errno == 2: raise exception.DestinationNotAccessible(e) else: raise exception.ServiceUnavailable(e)
def upload(fileobj, filename): cfg = Config() cfg.read_config_file(os.path.join(os.getenv("HOME"), ".s3cfg")) cfg.progress_meter = False cfg.acl_public = True s3 = S3(cfg) headers = SortedDict(ignore_case=True) headers["x-amz-acl"] = "public-read" headers["x-amz-storage-class"] = "REDUCED_REDUNDANCY" remote_uri = S3Uri(base_uri + filename) fileobj.seek(0, 2) # seek to end size = fileobj.tell() fileobj.seek(0) # seek to start response = s3.send_file_multipart(fileobj, headers, remote_uri, size) assert response['status'] == 200 return remote_uri.public_url()
def stat(self, pfn): """ Determines the file size in bytes of the provided file. :param pfn: The PFN the file. :returns: a dict containing the key filesize. """ info = self.__s3.object_info(S3Uri(pfn)) return {'filesize': int(info['headers']['content-length'])}
def rename(self, pfn, new_pfn): """ Allows to rename a file stored inside the connected RSE. :param path: path to the current file on the storage :param new_path: path to the new file on the storage :raises DestinationNotAccessible: if the destination storage was not accessible. :raises ServiceUnavailable: if some generic error occured in the library. :raises SourceNotFound: if the source file was not found on the referred storage. """ try: self.__s3.object_move(S3Uri(pfn), S3Uri(new_pfn)) except S3Error as e: if e.status in [404, 403]: if self.exists(pfn): raise exception.SourceNotFound(e) else: raise exception.DestinationNotAccessible(e) else: raise exception.ServiceUnavailable(e)
def delete(self, pfn): """ Deletes a file from the connected RSE. :param path: path to the to be deleted file :raises ServiceUnavailable: if some generic error occured in the library. :raises SourceNotFound: if the source file was not found on the referred storage. """ try: self.__s3.object_delete(S3Uri(pfn)) except S3Error as e: if e.status in [404, 403]: raise exception.SourceNotFound(e) else: raise exception.ServiceUnavailable(e)
def exists(self, pfn): """ Checks if the requested file is known by the referred RSE. :param path: Physical file name :returns: True if the file exists, False if it doesn't :raises SourceNotFound: if the source file was not found on the referred storage. """ try: self.__s3.object_info(S3Uri(pfn)) return True except S3Error as e: if e.status == 404: return False else: raise exception.ServiceUnavailable(e)
def cmd_bucket_create(args): #bucket, object = check_uri(args) print 'dentro al cmd create' s3 = S3(Config()) for arg in args: uri = S3Uri(arg) if not uri.type == "s3" or not uri.has_bucket() or uri.has_object(): raise ParameterError("Expecting S3 URI with just the bucket name set instead of '%s'" % arg) try: print 'dentro al try, provo il create' response = s3.bucket_create(uri.bucket(), Config().bucket_location) print 'ho la response' output(u"Bucket '%s' created" % uri.uri()) except S3Error, e: if S3.codes.has_key(e.info["Code"]): error(S3.codes[e.info["Code"]] % uri.bucket()) return else: raise
def put(self, source, target, source_dir=None): """ Allows to store files inside the referred RSE. :param source: path to the source file on the client file system :param target: path to the destination file on the storage :param source_dir: Path where the to be transferred files are stored in the local file system :raises DestinationNotAccessible: if the destination storage was not accessible. :raises ServiceUnavailable: if some generic error occured in the library. :raises SourceNotFound: if the source file was not found on the referred storage. """ full_name = source_dir + '/' + source if source_dir else source try: self.__s3.object_put(full_name, S3Uri(target)) except S3Error as e: if e.info['Code'] in ['NoSuchBucket', "AccessDenied"]: raise exception.DestinationNotAccessible(e) else: raise exception.ServiceUnavailable(e) except InvalidFileError as error: raise exception.SourceNotFound(error)