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.8 kB

10 months ago
10 months ago
10 months ago
10 months ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  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. "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/factory/reg"
  8. s3stg "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/s3"
  9. stgtypes "gitlink.org.cn/cloudream/jcs-pub/common/pkgs/storage/types"
  10. jcstypes "gitlink.org.cn/cloudream/jcs-pub/common/types"
  11. )
  12. func init() {
  13. reg.RegisterBuilder[*jcstypes.OBSType](newBuilder)
  14. }
  15. type builder struct {
  16. stgtypes.EmptyBuilder
  17. detail *jcstypes.UserSpaceDetail
  18. }
  19. func newBuilder(detail *jcstypes.UserSpaceDetail) stgtypes.StorageBuilder {
  20. return &builder{
  21. detail: detail,
  22. }
  23. }
  24. func (b *builder) FeatureDesc() stgtypes.FeatureDesc {
  25. return stgtypes.FeatureDesc{}
  26. }
  27. func (b *builder) CreateShardStore(typeOnly bool) (stgtypes.ShardStore, error) {
  28. stgType := b.detail.UserSpace.Storage.(*jcstypes.OBSType)
  29. cred, ok := b.detail.UserSpace.Credential.(*jcstypes.OBSCred)
  30. if !ok {
  31. return nil, fmt.Errorf("invalid storage credential type %T for obs storage", b.detail.UserSpace.Credential)
  32. }
  33. if typeOnly {
  34. return (*ShardStore)(nil), nil
  35. }
  36. cli, bucket, err := createClient(stgType, cred)
  37. if err != nil {
  38. return nil, err
  39. }
  40. return NewShardStore(b.detail, stgType, cred, cli, bucket)
  41. }
  42. func (b *builder) CreateBaseStore(typeOnly bool) (stgtypes.BaseStore, error) {
  43. stgType := b.detail.UserSpace.Storage.(*jcstypes.OBSType)
  44. cred, ok := b.detail.UserSpace.Credential.(*jcstypes.OBSCred)
  45. if !ok {
  46. return nil, fmt.Errorf("invalid storage credential type %T for obs storage", b.detail.UserSpace.Credential)
  47. }
  48. if typeOnly {
  49. return (*s3stg.BaseStore)(nil), nil
  50. }
  51. cli, bucket, err := createClient(stgType, cred)
  52. if err != nil {
  53. return nil, err
  54. }
  55. return s3stg.NewBaseStore(b.detail, cli, bucket, s3stg.BaseStoreOption{UseAWSSha256: false})
  56. }
  57. func createClient(stgType *jcstypes.OBSType, cred *jcstypes.OBSCred) (*s3.Client, string, error) {
  58. awsConfig := aws.Config{}
  59. cre := aws.Credentials{
  60. AccessKeyID: cred.AK,
  61. SecretAccessKey: cred.SK,
  62. }
  63. awsConfig.Credentials = &credentials.StaticCredentialsProvider{Value: cre}
  64. awsConfig.Region = stgType.Region
  65. awsConfig.RetryMaxAttempts = 1
  66. options := []func(*s3.Options){}
  67. options = append(options, func(s3Opt *s3.Options) {
  68. s3Opt.BaseEndpoint = &stgType.Endpoint
  69. })
  70. cli := s3.NewFromConfig(awsConfig, options...)
  71. return cli, stgType.Bucket, nil
  72. }
  73. func (b *builder) CreateMultiparter(typeOnly bool) (stgtypes.Multiparter, error) {
  74. stgType := b.detail.UserSpace.Storage.(*jcstypes.OBSType)
  75. feat := stgtypes.FindFeature[*jcstypes.MultipartUploadFeature](b.detail)
  76. if feat == nil {
  77. return nil, fmt.Errorf("feature %T not found", jcstypes.MultipartUploadFeature{})
  78. }
  79. if typeOnly {
  80. return (*s3stg.Multiparter)(nil), nil
  81. }
  82. cred, ok := b.detail.UserSpace.Credential.(*jcstypes.OBSCred)
  83. if !ok {
  84. return nil, fmt.Errorf("invalid storage credential type %T for obs storage", b.detail.UserSpace.Credential)
  85. }
  86. cli, bucket, err := createClient(stgType, cred)
  87. if err != nil {
  88. return nil, err
  89. }
  90. return s3stg.NewMultiparter(
  91. b.detail,
  92. feat,
  93. bucket,
  94. cli,
  95. ), nil
  96. }
  97. func (b *builder) CreateS2STransfer(typeOnly bool) (stgtypes.S2STransfer, error) {
  98. stgType := b.detail.UserSpace.Storage.(*jcstypes.OBSType)
  99. feat := stgtypes.FindFeature[*jcstypes.S2STransferFeature](b.detail)
  100. if feat == nil {
  101. return nil, fmt.Errorf("feature %T not found", jcstypes.S2STransferFeature{})
  102. }
  103. if typeOnly {
  104. return (*S2STransfer)(nil), nil
  105. }
  106. cred, ok := b.detail.UserSpace.Credential.(*jcstypes.OBSCred)
  107. if !ok {
  108. return nil, fmt.Errorf("invalid storage credential type %T for obs storage", b.detail.UserSpace.Credential)
  109. }
  110. return NewS2STransfer(b.detail, stgType, cred, feat), nil
  111. }

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