support minio as object storage
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
package storage
|
||||
|
||||
import (
|
||||
"context"
|
||||
"crypto/tls"
|
||||
"net/http"
|
||||
|
||||
"github.com/minio/minio-go/v7"
|
||||
"github.com/minio/minio-go/v7/pkg/credentials"
|
||||
|
||||
"github.com/mayswind/ezbookkeeping/pkg/settings"
|
||||
)
|
||||
|
||||
// MinIOObjectStorage represents MinIO object storage
|
||||
type MinIOObjectStorage struct {
|
||||
minIOClient *minio.Client
|
||||
minIOConfig *settings.MinIOConfig
|
||||
rootPath string
|
||||
}
|
||||
|
||||
// NewMinIOObjectStorage returns a MinIO object storage
|
||||
func NewMinIOObjectStorage(config *settings.Config, pathPrefix string) (*MinIOObjectStorage, error) {
|
||||
minIOConfig := config.MinIOConfig
|
||||
|
||||
minIOClient, err := minio.New(minIOConfig.Endpoint, &minio.Options{
|
||||
Region: minIOConfig.Location,
|
||||
Creds: credentials.NewStaticV4(minIOConfig.AccessKeyID, minIOConfig.SecretAccessKey, ""),
|
||||
Secure: minIOConfig.UseSSL,
|
||||
Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: minIOConfig.SkipTLSVerify}},
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
storage := &MinIOObjectStorage{
|
||||
minIOClient: minIOClient,
|
||||
minIOConfig: minIOConfig,
|
||||
rootPath: minIOConfig.RootPath,
|
||||
}
|
||||
|
||||
storage.rootPath = storage.getFinalPath(pathPrefix)
|
||||
|
||||
ctx := context.Background()
|
||||
exists, err := minIOClient.BucketExists(ctx, minIOConfig.Bucket)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if !exists {
|
||||
err := minIOClient.MakeBucket(ctx, minIOConfig.Bucket, minio.MakeBucketOptions{
|
||||
Region: minIOConfig.Location,
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
return storage, nil
|
||||
}
|
||||
|
||||
// Exists returns whether the file exists
|
||||
func (s *MinIOObjectStorage) Exists(path string) (bool, error) {
|
||||
ctx := context.Background()
|
||||
objectInfo, err := s.minIOClient.StatObject(ctx, s.minIOConfig.Bucket, s.getFinalPath(path), minio.StatObjectOptions{})
|
||||
|
||||
if err == nil && !objectInfo.IsDeleteMarker {
|
||||
return true, nil
|
||||
}
|
||||
|
||||
return false, err
|
||||
}
|
||||
|
||||
// Read returns the object instance according to specified the file path
|
||||
func (s *MinIOObjectStorage) Read(path string) (ObjectInStorage, error) {
|
||||
ctx := context.Background()
|
||||
return s.minIOClient.GetObject(ctx, s.minIOConfig.Bucket, s.getFinalPath(path), minio.GetObjectOptions{})
|
||||
}
|
||||
|
||||
// Save returns whether save the object instance successfully
|
||||
func (s *MinIOObjectStorage) Save(path string, object ObjectInStorage) error {
|
||||
ctx := context.Background()
|
||||
_, err := s.minIOClient.PutObject(ctx, s.minIOConfig.Bucket, s.getFinalPath(path), object, -1, minio.PutObjectOptions{})
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// Delete returns whether delete the object according to specified the file path successfully
|
||||
func (s *MinIOObjectStorage) Delete(path string) error {
|
||||
ctx := context.Background()
|
||||
return s.minIOClient.RemoveObject(ctx, s.minIOConfig.Bucket, s.getFinalPath(path), minio.RemoveObjectOptions{})
|
||||
}
|
||||
|
||||
func (s *MinIOObjectStorage) getFinalPath(path string) string {
|
||||
rootPath := s.rootPath
|
||||
|
||||
if len(rootPath) < 1 || rootPath[len(rootPath)-1] != '/' {
|
||||
rootPath = rootPath + "/"
|
||||
}
|
||||
|
||||
if len(path) > 0 && path[0] == '/' {
|
||||
path = path[1:]
|
||||
}
|
||||
|
||||
return rootPath + path
|
||||
}
|
||||
@@ -22,8 +22,13 @@ var (
|
||||
// InitializeStorageContainer initializes the current object storage according to the config
|
||||
func InitializeStorageContainer(config *settings.Config) error {
|
||||
if config.StorageType == settings.LocalFileSystemObjectStorageType {
|
||||
storage, err := NewLocalFileSystemObjectStorage(config, avatarPathPrefix)
|
||||
Container.AvatarCurrentStorage = storage
|
||||
avatarStorage, err := NewLocalFileSystemObjectStorage(config, avatarPathPrefix)
|
||||
Container.AvatarCurrentStorage = avatarStorage
|
||||
|
||||
return err
|
||||
} else if config.StorageType == settings.MinIOStorageType {
|
||||
avatarStorage, err := NewMinIOObjectStorage(config, avatarPathPrefix)
|
||||
Container.AvatarCurrentStorage = avatarStorage
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user