bucket.go 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. package tos
  2. import (
  3. "bytes"
  4. "context"
  5. "net/http"
  6. "github.com/volcengine/ve-tos-golang-sdk/v2/tos/enum"
  7. )
  8. // Bucket create a Bucket handle
  9. //
  10. // Deprecated: request with bucket handle is deprecated, use ClientV2 instead
  11. func (cli *Client) Bucket(bucket string) (*Bucket, error) {
  12. if err := isValidBucketName(bucket, false); err != nil {
  13. return nil, err
  14. }
  15. return &Bucket{name: bucket, client: cli, baseClient: newBaseClient(cli)}, nil
  16. }
  17. // CreateBucket create a bucket
  18. //
  19. // Deprecated: use CreateBucket of ClientV2 instead
  20. func (cli *Client) CreateBucket(ctx context.Context, input *CreateBucketInput) (*CreateBucketOutput, error) {
  21. if err := isValidBucketName(input.Bucket, false); err != nil {
  22. return nil, err
  23. }
  24. res, err := cli.newBuilder(input.Bucket, "").
  25. WithHeader(HeaderACL, input.ACL).
  26. WithHeader(HeaderGrantFullControl, input.GrantFullControl).
  27. WithHeader(HeaderGrantRead, input.GrantRead).
  28. WithHeader(HeaderGrantReadAcp, input.GrantReadAcp).
  29. WithHeader(HeaderGrantWrite, input.GrantWrite).
  30. WithHeader(HeaderGrantWriteAcp, input.GrantWriteAcp).
  31. WithRetry(nil, StatusCodeClassifier{}).
  32. Request(ctx, http.MethodPut, nil, cli.roundTripper(http.StatusOK))
  33. if err != nil {
  34. return nil, err
  35. }
  36. defer res.Close()
  37. return &CreateBucketOutput{
  38. RequestInfo: res.RequestInfo(),
  39. Location: res.Header.Get(HeaderLocation),
  40. }, nil
  41. }
  42. // CreateBucketV2 create a bucket
  43. func (cli *ClientV2) CreateBucketV2(ctx context.Context, input *CreateBucketV2Input) (*CreateBucketV2Output, error) {
  44. if err := isValidBucketName(input.Bucket, cli.isCustomDomain); err != nil {
  45. return nil, err
  46. }
  47. // TODO: ACL和Grant不能同时设置,可以在sdk校验
  48. if err := isValidACL(input.ACL); len(input.ACL) != 0 && err != nil {
  49. return nil, err
  50. }
  51. if err := isValidStorageClass(input.StorageClass); len(input.StorageClass) != 0 && err != nil {
  52. return nil, err
  53. }
  54. if err := isValidAzRedundancy(input.AzRedundancy); len(input.AzRedundancy) != 0 && err != nil {
  55. return nil, err
  56. }
  57. res, err := cli.newBuilder(input.Bucket, "").
  58. WithParams(*input).
  59. WithRetry(nil, StatusCodeClassifier{}).
  60. Request(ctx, http.MethodPut, nil, cli.roundTripper(http.StatusOK))
  61. if err != nil {
  62. return nil, err
  63. }
  64. defer res.Close()
  65. return &CreateBucketV2Output{
  66. CreateBucketOutput: CreateBucketOutput{
  67. RequestInfo: res.RequestInfo(),
  68. Location: res.Header.Get(HeaderLocation)}}, nil
  69. }
  70. // HeadBucket get some info of a bucket
  71. //
  72. // Deprecated: use HeadBucket of ClientV2 instead
  73. func (cli *Client) HeadBucket(ctx context.Context, bucket string) (*HeadBucketOutput, error) {
  74. if err := isValidBucketName(bucket, cli.isCustomDomain); err != nil {
  75. return nil, err
  76. }
  77. res, err := cli.newBuilder(bucket, "").
  78. WithRetry(nil, StatusCodeClassifier{}).
  79. Request(ctx, http.MethodHead, nil, cli.roundTripper(http.StatusOK))
  80. if err != nil {
  81. return nil, err
  82. }
  83. defer res.Close()
  84. return &HeadBucketOutput{
  85. RequestInfo: res.RequestInfo(),
  86. Region: res.Header.Get(HeaderBucketRegion),
  87. StorageClass: enum.StorageClassType(res.Header.Get(HeaderStorageClass)),
  88. AzRedundancy: enum.AzRedundancyType(res.Header.Get(HeaderAzRedundancy)),
  89. }, nil
  90. }
  91. // HeadBucket get some info of a bucket
  92. func (cli *ClientV2) HeadBucket(ctx context.Context, input *HeadBucketInput) (*HeadBucketOutput, error) {
  93. return cli.Client.HeadBucket(ctx, input.Bucket)
  94. }
  95. // DeleteBucket delete a bucket
  96. //
  97. // Deprecated: use DeleteBucket of ClientV2 instead
  98. func (cli *Client) DeleteBucket(ctx context.Context, bucket string) (*DeleteBucketOutput, error) {
  99. if err := isValidBucketName(bucket, cli.isCustomDomain); err != nil {
  100. return nil, err
  101. }
  102. res, err := cli.newBuilder(bucket, "").
  103. WithRetry(nil, StatusCodeClassifier{}).
  104. Request(ctx, http.MethodDelete, nil, cli.roundTripper(http.StatusNoContent))
  105. if err != nil {
  106. return nil, err
  107. }
  108. defer res.Close()
  109. return &DeleteBucketOutput{RequestInfo: res.RequestInfo()}, nil
  110. }
  111. // DeleteBucket delete a bucket.Deleting a non-empty bucket is not allowed.
  112. // A bucket is empty only if there is no exist object and uncanceled segmented tasks.
  113. func (cli *ClientV2) DeleteBucket(ctx context.Context, input *DeleteBucketInput) (*DeleteBucketOutput, error) {
  114. return cli.Client.DeleteBucket(ctx, input.Bucket)
  115. }
  116. // ListBuckets list the buckets that the AK can access
  117. //
  118. // Deprecated: use ListBuckets of ClientV2 instead
  119. func (cli *Client) ListBuckets(ctx context.Context, _ *ListBucketsInput) (*ListBucketsOutput, error) {
  120. res, err := cli.newBuilder("", "").
  121. WithRetry(nil, StatusCodeClassifier{}).
  122. Request(ctx, http.MethodGet, nil, cli.roundTripper(http.StatusOK))
  123. if err != nil {
  124. return nil, err
  125. }
  126. defer res.Close()
  127. output := ListBucketsOutput{RequestInfo: res.RequestInfo()}
  128. if err = marshalOutput(output.RequestID, res.Body, &output); err != nil {
  129. return nil, err
  130. }
  131. return &output, nil
  132. }
  133. // ListBuckets list the buckets that the AK can access
  134. func (cli *ClientV2) ListBuckets(ctx context.Context, _ *ListBucketsInput) (*ListBucketsOutput, error) {
  135. res, err := cli.newBuilder("", "").
  136. WithRetry(nil, StatusCodeClassifier{}).
  137. Request(ctx, http.MethodGet, nil, cli.roundTripper(http.StatusOK))
  138. if err != nil {
  139. return nil, err
  140. }
  141. defer res.Close()
  142. output := ListBucketsOutput{RequestInfo: res.RequestInfo()}
  143. if err = marshalOutput(output.RequestID, res.Body, &output); err != nil {
  144. return nil, err
  145. }
  146. return &output, nil
  147. }
  148. func (cli *ClientV2) PutBucketStorageClass(ctx context.Context, input *PutBucketStorageClassInput) (*PutBucketStorageClassOutput, error) {
  149. if input == nil {
  150. return nil, InputIsNilClientError
  151. }
  152. if err := isValidBucketName(input.Bucket, cli.isCustomDomain); err != nil {
  153. return nil, err
  154. }
  155. if err := isValidStorageClass(input.StorageClass); err != nil {
  156. return nil, err
  157. }
  158. res, err := cli.newBuilder(input.Bucket, "").
  159. WithQuery("storageClass", "").
  160. WithParams(*input).
  161. WithRetry(nil, StatusCodeClassifier{}).
  162. Request(ctx, http.MethodPut, nil, cli.roundTripper(http.StatusOK))
  163. if err != nil {
  164. return nil, err
  165. }
  166. defer res.Close()
  167. output := PutBucketStorageClassOutput{RequestInfo: res.RequestInfo()}
  168. return &output, nil
  169. }
  170. func (cli *ClientV2) GetBucketLocation(ctx context.Context, input *GetBucketLocationInput) (*GetBucketLocationOutput, error) {
  171. if input == nil {
  172. return nil, InputIsNilClientError
  173. }
  174. if err := isValidBucketName(input.Bucket, cli.isCustomDomain); err != nil {
  175. return nil, err
  176. }
  177. res, err := cli.newBuilder(input.Bucket, "").
  178. WithQuery("location", "").
  179. WithRetry(nil, StatusCodeClassifier{}).
  180. Request(ctx, http.MethodGet, nil, cli.roundTripper(http.StatusOK))
  181. if err != nil {
  182. return nil, err
  183. }
  184. defer res.Close()
  185. output := GetBucketLocationOutput{RequestInfo: res.RequestInfo()}
  186. if err = marshalOutput(output.RequestID, res.Body, &output); err != nil {
  187. return nil, err
  188. }
  189. return &output, nil
  190. }
  191. func (cli *ClientV2) PutBucketVersioning(ctx context.Context, input *PutBucketVersioningInput) (*PutBucketVersioningOutput, error) {
  192. if input == nil {
  193. return nil, InputIsNilClientError
  194. }
  195. if err := isValidBucketName(input.Bucket, cli.isCustomDomain); err != nil {
  196. return nil, err
  197. }
  198. data, contentMD5, err := marshalInput("PutBucketVersioning", putBucketVersioningInput{
  199. Status: input.Status,
  200. })
  201. if err != nil {
  202. return nil, err
  203. }
  204. res, err := cli.newBuilder(input.Bucket, "").
  205. WithQuery("versioning", "").
  206. WithHeader(HeaderContentMD5, contentMD5).
  207. WithRetry(OnRetryFromStart, StatusCodeClassifier{}).
  208. Request(ctx, http.MethodPut, bytes.NewReader(data), cli.roundTripper(http.StatusOK))
  209. if err != nil {
  210. return nil, err
  211. }
  212. defer res.Close()
  213. output := PutBucketVersioningOutput{RequestInfo: res.RequestInfo()}
  214. return &output, nil
  215. }
  216. func (cli *ClientV2) GetBucketVersioning(ctx context.Context, input *GetBucketVersioningInput) (*GetBucketVersioningOutputV2, error) {
  217. if input == nil {
  218. return nil, InputIsNilClientError
  219. }
  220. if err := isValidBucketName(input.Bucket, cli.isCustomDomain); err != nil {
  221. return nil, err
  222. }
  223. res, err := cli.newBuilder(input.Bucket, "").
  224. WithQuery("versioning", "").
  225. WithRetry(nil, StatusCodeClassifier{}).
  226. Request(ctx, http.MethodGet, nil, cli.roundTripper(http.StatusOK))
  227. if err != nil {
  228. return nil, err
  229. }
  230. defer res.Close()
  231. output := GetBucketVersioningOutputV2{RequestInfo: res.RequestInfo()}
  232. if err = marshalOutput(output.RequestID, res.Body, &output); err != nil {
  233. return nil, err
  234. }
  235. return &output, nil
  236. }