def delete(self, name: str) -> None: if self.backup_format and self.backup_bucket: try: obj = self.client.get_object(self.bucket_name, name) except merr.ResponseError as error: raise minio_error( "Could not obtain file {} " "to make a copy of it".format(name), error, ) try: content_length = int(obj.getheader("Content-Length")) except ValueError as error: raise minio_error(f"Could not backup removed file {name}", error) # Creates the backup filename target_name = "{}{}".format( timezone.now().strftime(self.backup_format), name) try: self.client.put_object(self.backup_bucket, target_name, obj, content_length) except merr.ResponseError as error: raise minio_error( "Could not make a copy of file " "{} before removing it".format(name), error, ) try: self.client.remove_object(self.bucket_name, name) except merr.ResponseError as error: raise minio_error(f"Could not remove file {name}", error)
def modified_time(self, name: str) -> datetime.datetime: try: info = self.client.stat_object(self.bucket_name, name) return datetime.datetime.fromtimestamp(mktime(info.last_modified)) except merr.ResponseError as error: raise minio_error( f"Could not access modification time for file {name}", error)
def listdir(self, path: str) -> T.Tuple[T.List, T.List]: # [None, "", "."] is supported to mean the configured root among various # implementations of Storage implementations so we copy that behaviour even if # maybe None should raise an exception instead. # # If the path prefix does not match anything full prefix that does exist this # function will just return empty results, this is different from # FileSystemStorage where an invalid directory would raise an OSError. if path in [None, "", ".", "/"]: path = "" else: if not path.endswith("/"): path += "/" dirs: T.List[str] = [] files: T.List[str] = [] try: objects = self.client.list_objects_v2(self.bucket_name, prefix=path) for o in objects: p = posixpath.relpath(o.object_name, path) if o.is_dir: dirs.append(p) else: files.append(p) return dirs, files except merr.NoSuchBucket: raise except merr.ResponseError as error: raise minio_error(f"Could not list directory {path}", error)
def _open(self, name, mode="rb"): try: f = self.file_class(self._sanitize_path(name), mode, self) except merr.MinioError as e: raise minio_error( "File {} could not be saved: {}".format(name, str(e)), e) return f
def size(self, name): try: info = self.client.stat_object(self.bucket_name, name) return info.size except merr.ResponseError as error: raise minio_error("Could not access file size for {}".format(name), error)
def exists(self, name: str) -> bool: try: self.client.stat_object(self.bucket_name, self._sanitize_path(name)) return True except merr.ResponseError as error: # TODO - deprecate if error.code == "NoSuchKey": return False else: raise minio_error(f"Could not stat file {name}", error) except merr.NoSuchKey: return False except merr.NoSuchBucket: raise except Exception as error: logger.error(error)
def _save(self, name: str, content: bytes) -> str: try: if hasattr(content, "seek") and callable(content.seek): content.seek(0) content_size, content_type, sane_name = self._examine_file(name, content) self.client.put_object( self.bucket_name, sane_name, content, content_size, content_type, metadata=self.object_metadata, ) return sane_name except merr.ResponseError as error: raise minio_error(f"File {name} could not be saved", error)
def _get_file(self): if self._file is None: try: obj = self._storage.client.get_object( self._storage.bucket_name, self.name) self._file = tempfile.SpooledTemporaryFile( max_size=self.max_memory_size) for d in obj.stream(amt=1024 * 1024): self._file.write(d) self._file.seek(0) return self._file except merr.ResponseError as error: raise minio_error(f"File {self.name} does not exist", error) finally: try: obj.release_conn() except Exception as e: logger.error(str(e)) return self._file
def size(self, name: str) -> int: try: info = self.client.stat_object(self.bucket_name, name) return info.size except merr.ResponseError as error: raise minio_error(f"Could not access file size for {name}", error)