// Copyright 2022 ROC. All rights reserved. // Use of this source code is governed by a MIT style // license that can be found in the LICENSE file. package storage import ( "fmt" "net/http" "net/url" "path/filepath" "strconv" "time" "github.com/aliyun/aliyun-oss-go-sdk/oss" "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs" "github.com/minio/minio-go/v7" "github.com/minio/minio-go/v7/pkg/credentials" "github.com/rocboss/paopao-ce/internal/conf" "github.com/rocboss/paopao-ce/internal/core" "github.com/rocboss/paopao-ce/pkg/cfg" "github.com/sirupsen/logrus" "github.com/tencentyun/cos-go-sdk-v5" ) func MustAliossService() (core.ObjectStorageService, core.VersionInfo) { client, err := oss.New(conf.AliOSSSetting.Endpoint, conf.AliOSSSetting.AccessKeyID, conf.AliOSSSetting.AccessKeySecret) if err != nil { logrus.Fatalf("storage.MustAliossService create client err: %s", err) } bucket, err := client.Bucket(conf.AliOSSSetting.Bucket) if err != nil { logrus.Fatalf("storage.MustAliossService create bucket err: %s", err) } domain := conf.GetOssDomain() var cs core.OssCreateService if cfg.If("OSS:TempDir") { cs = &aliossCreateTempDirServant{ bucket: bucket, domain: domain, tempDir: conf.ObjectStorage.TempDirSlash(), } logrus.Debugln("use OSS:TempDir feature") } else if cfg.If("OSS:Retention") { cs = &aliossCreateRetentionServant{ bucket: bucket, domain: domain, retainInDays: time.Duration(conf.ObjectStorage.RetainInDays) * time.Hour * 24, retainUntilDate: time.Date(2049, time.December, 1, 12, 0, 0, 0, time.UTC), } logrus.Debugln("use OSS:Retention feature") } else { cs = &aliossCreateServant{ bucket: bucket, domain: domain, } logrus.Debugln("use OSS:Direct feature") } obj := &aliossServant{ OssCreateService: cs, bucket: bucket, domain: conf.GetOssDomain(), } return obj, obj } func NewCosService() (core.ObjectStorageService, core.VersionInfo) { u, _ := url.Parse(fmt.Sprintf("https://%s.cos.%s.myqcloud.com", conf.COSSetting.Bucket, conf.COSSetting.Region)) su, _ := url.Parse(fmt.Sprintf("https://cos.%s.myqcloud.com", conf.COSSetting.Region)) client := cos.NewClient(&cos.BaseURL{BucketURL: u, ServiceURL: su}, &http.Client{ Transport: &cos.AuthorizationTransport{ SecretID: conf.COSSetting.SecretID, SecretKey: conf.COSSetting.SecretKey, }, }) domain := conf.GetOssDomain() var cs core.OssCreateService if cfg.If("OSS:TempDir") { cs = &cosCreateTempDirServant{ client: client, domain: domain, bucketUrl: fmt.Sprintf("%s.cos.%s.myqcloud.com/", conf.COSSetting.Bucket, conf.COSSetting.Region), tempDir: conf.ObjectStorage.TempDirSlash(), } logrus.Debugln("use OSS:TempDir feature") } else { cs = &cosCreateServant{ client: client, domain: domain, } logrus.Debugln("use OSS:Direct feature") } obj := &cosServant{ OssCreateService: cs, client: client, domain: domain, } return obj, obj } func MustHuaweiobsService() (core.ObjectStorageService, core.VersionInfo) { s := conf.HuaweiOBSSetting client, err := obs.New(s.AccessKey, s.SecretKey, s.Endpoint) if err != nil { logrus.Fatalf("storage.MustHuaweiobsService create huawei obs client failed: %s", err) } domain := conf.GetOssDomain() var cs core.OssCreateService if cfg.If("OSS:TempDir") { cs = &hwobsCreateTempDirServant{ client: client, bucket: s.Bucket, domain: domain, tempDir: conf.ObjectStorage.TempDirSlash(), } logrus.Debugln("use OSS:TempDir feature") } else if cfg.If("OSS:Retention") { retainUntilDays := time.Until(time.Date(2049, time.December, 1, 12, 0, 0, 0, time.UTC)) / (24 * time.Hour) cs = &hwobsCreateRetentionServant{ client: client, bucket: s.Bucket, domain: domain, retainInDays: int64(conf.ObjectStorage.RetainInDays), retainUntilDays: strconv.FormatInt(int64(retainUntilDays), 10), } logrus.Debugln("use OSS:Retention feature") } else { cs = &hwobsCreateServant{ client: client, bucket: s.Bucket, domain: domain, } logrus.Debugln("use OSS:Direct feature") } obj := &huaweiobsServant{ OssCreateService: cs, client: client, bucket: s.Bucket, domain: domain, } return obj, obj } func MustLocalossService() (core.ObjectStorageService, core.VersionInfo) { savePath, err := filepath.Abs(conf.LocalOSSSetting.SavePath) if err != nil { logrus.Fatalf("storage.MustLocalossService get localOSS save path err: %s", err) } domain := conf.GetOssDomain() savePath = savePath + "/" + conf.LocalOSSSetting.Bucket + "/" var cs core.OssCreateService if cfg.If("OSS:TempDir") { cs = &localossCreateTempDirServant{ savePath: savePath, domain: domain, tempDir: conf.ObjectStorage.TempDirSlash(), } logrus.Debugln("use OSS:TempDir feature") } else { cs = &localossCreateServant{ savePath: savePath, domain: domain, } logrus.Debugln("use OSS:Direct feature") } obj := &localossServant{ OssCreateService: cs, savePath: savePath, domain: domain, } return obj, obj } func MustMinioService() (core.ObjectStorageService, core.VersionInfo) { // Initialize minio client object. client, err := minio.New(conf.MinIOSetting.Endpoint, &minio.Options{ Creds: credentials.NewStaticV4(conf.MinIOSetting.AccessKey, conf.MinIOSetting.SecretKey, ""), Secure: conf.MinIOSetting.Secure, }) if err != nil { logrus.Fatalf("storage.MustMinioService create client failed: %s", err) } domain := conf.GetOssDomain() var cs core.OssCreateService if cfg.If("OSS:TempDir") { cs = &minioCreateTempDirServant{ client: client, bucket: conf.MinIOSetting.Bucket, domain: domain, tempDir: conf.ObjectStorage.TempDirSlash(), } logrus.Debugln("use OSS:TempDir feature") } else if cfg.If("OSS:Retention") { cs = &minioCreateRetentionServant{ client: client, bucket: conf.MinIOSetting.Bucket, domain: domain, retainInDays: time.Duration(conf.ObjectStorage.RetainInDays) * time.Hour * 24, retainUntilDate: time.Date(2049, time.December, 1, 12, 0, 0, 0, time.UTC), } logrus.Debugln("use OSS:Retention feature") } else { cs = &minioCreateServant{ client: client, bucket: conf.MinIOSetting.Bucket, domain: domain, } logrus.Debugln("use OSS:Direct feature") } obj := &minioServant{ OssCreateService: cs, client: client, bucket: conf.MinIOSetting.Bucket, domain: domain, } return obj, obj } func MustS3Service() (core.ObjectStorageService, core.VersionInfo) { // Initialize s3 client object use minio-go. client, err := minio.New(conf.S3Setting.Endpoint, &minio.Options{ Creds: credentials.NewStaticV4(conf.S3Setting.AccessKey, conf.S3Setting.SecretKey, ""), Secure: conf.S3Setting.Secure, }) if err != nil { logrus.Fatalf("storage.MustS3Service create client failed: %s", err) } domain := conf.GetOssDomain() var cs core.OssCreateService if cfg.If("OSS:TempDir") { cs = &minioCreateTempDirServant{ client: client, bucket: conf.S3Setting.Bucket, domain: domain, tempDir: conf.ObjectStorage.TempDirSlash(), } logrus.Debugln("use OSS:TempDir feature") } else if cfg.If("OSS:Retention") { cs = &minioCreateRetentionServant{ client: client, bucket: conf.S3Setting.Bucket, domain: domain, retainInDays: time.Duration(conf.ObjectStorage.RetainInDays) * time.Hour * 24, retainUntilDate: time.Date(2049, time.December, 1, 12, 0, 0, 0, time.UTC), } logrus.Debugln("use OSS:Retention feature") } else { cs = &minioCreateServant{ client: client, bucket: conf.S3Setting.Bucket, domain: domain, } logrus.Debugln("use OSS:Direct feature") } obj := &s3Servant{ OssCreateService: cs, client: client, bucket: conf.S3Setting.Bucket, domain: domain, } return obj, obj }