Example #1
0
    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)
Example #2
0
 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)
Example #3
0
    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)
Example #4
0
 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)
Example #6
0
 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)
Example #7
0
 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)
Example #8
0
 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
Example #9
0
 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)