You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

obs.go 3.3 kB

10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package obs
  2. import (
  3. "fmt"
  4. "github.com/aws/aws-sdk-go-v2/aws"
  5. "github.com/aws/aws-sdk-go-v2/credentials"
  6. "github.com/aws/aws-sdk-go-v2/service/s3"
  7. clitypes "gitlink.org.cn/cloudream/storage2/client/types"
  8. "gitlink.org.cn/cloudream/storage2/common/pkgs/storage/factory/reg"
  9. s3stg "gitlink.org.cn/cloudream/storage2/common/pkgs/storage/s3"
  10. "gitlink.org.cn/cloudream/storage2/common/pkgs/storage/types"
  11. "gitlink.org.cn/cloudream/storage2/common/pkgs/storage/utils"
  12. cortypes "gitlink.org.cn/cloudream/storage2/coordinator/types"
  13. )
  14. func init() {
  15. reg.RegisterBuilder[*cortypes.OBSType](newBuilder)
  16. }
  17. type builder struct {
  18. types.EmptyBuilder
  19. detail *clitypes.UserSpaceDetail
  20. }
  21. func newBuilder(detail *clitypes.UserSpaceDetail) types.StorageBuilder {
  22. return &builder{
  23. detail: detail,
  24. }
  25. }
  26. func (b *builder) FeatureDesc() types.FeatureDesc {
  27. return types.FeatureDesc{
  28. HasBypassWrite: true,
  29. HasBypassRead: true,
  30. HasBypassHTTPRead: true,
  31. }
  32. }
  33. func (b *builder) CreateShardStore() (types.ShardStore, error) {
  34. cred, ok := b.detail.UserSpace.Credential.(*cortypes.OBSCred)
  35. if !ok {
  36. return nil, fmt.Errorf("invalid storage credential type %T for obs storage", b.detail.UserSpace.Credential)
  37. }
  38. cli, bucket, err := createClient(cred)
  39. if err != nil {
  40. return nil, err
  41. }
  42. return NewShardStore(b.detail, cred, cli, bucket)
  43. }
  44. func (b *builder) CreatePublicStore() (types.PublicStore, error) {
  45. cred, ok := b.detail.UserSpace.Credential.(*cortypes.OBSCred)
  46. if !ok {
  47. return nil, fmt.Errorf("invalid storage credential type %T for obs storage", b.detail.UserSpace.Credential)
  48. }
  49. cli, bucket, err := createClient(cred)
  50. if err != nil {
  51. return nil, err
  52. }
  53. return s3stg.NewPublicStore(b.detail, cli, bucket)
  54. }
  55. func createClient(cred *cortypes.OBSCred) (*s3.Client, string, error) {
  56. awsConfig := aws.Config{}
  57. cre := aws.Credentials{
  58. AccessKeyID: cred.AK,
  59. SecretAccessKey: cred.SK,
  60. }
  61. awsConfig.Credentials = &credentials.StaticCredentialsProvider{Value: cre}
  62. awsConfig.Region = cred.Region
  63. options := []func(*s3.Options){}
  64. options = append(options, func(s3Opt *s3.Options) {
  65. s3Opt.BaseEndpoint = &cred.Endpoint
  66. })
  67. cli := s3.NewFromConfig(awsConfig, options...)
  68. return cli, cred.Bucket, nil
  69. }
  70. func (b *builder) CreateMultiparter() (types.Multiparter, error) {
  71. feat := utils.FindFeature[*cortypes.MultipartUploadFeature](b.detail.Storage)
  72. if feat == nil {
  73. return nil, fmt.Errorf("feature %T not found", cortypes.MultipartUploadFeature{})
  74. }
  75. cred, ok := b.detail.UserSpace.Credential.(*cortypes.OBSCred)
  76. if !ok {
  77. return nil, fmt.Errorf("invalid storage credential type %T for obs storage", b.detail.UserSpace.Credential)
  78. }
  79. cli, bucket, err := createClient(cred)
  80. if err != nil {
  81. return nil, err
  82. }
  83. return s3stg.NewMultiparter(
  84. b.detail,
  85. feat,
  86. bucket,
  87. cli,
  88. ), nil
  89. }
  90. func (b *builder) CreateS2STransfer() (types.S2STransfer, error) {
  91. feat := utils.FindFeature[*cortypes.S2STransferFeature](b.detail.Storage)
  92. if feat == nil {
  93. return nil, fmt.Errorf("feature %T not found", cortypes.S2STransferFeature{})
  94. }
  95. cred, ok := b.detail.UserSpace.Credential.(*cortypes.OBSCred)
  96. if !ok {
  97. return nil, fmt.Errorf("invalid storage credential type %T for obs storage", b.detail.UserSpace.Credential)
  98. }
  99. return NewS2STransfer(cred, feat), nil
  100. }

本项目旨在将云际存储公共基础设施化,使个人及企业可低门槛使用高效的云际存储服务(安装开箱即用云际存储客户端即可,无需关注其他组件的部署),同时支持用户灵活便捷定制云际存储的功能细节。