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

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