lifecycle.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. package tos
  2. import (
  3. "bytes"
  4. "context"
  5. "net/http"
  6. "time"
  7. )
  8. func (cli *ClientV2) parseLifecycleInput(input *PutBucketLifecycleInput) putBucketLifecycleInput {
  9. lifecycleInput := make([]lifecycleRule, 0, len(input.Rules))
  10. for _, lifecycle := range input.Rules {
  11. var exp *expiration
  12. if lifecycle.Expiration != nil {
  13. exp = &expiration{
  14. Days: lifecycle.Expiration.Days,
  15. }
  16. if !lifecycle.Expiration.Date.IsZero() {
  17. exp.Date = lifecycle.Expiration.Date.Format(time.RFC3339)
  18. }
  19. }
  20. transitionList := make([]transition, 0, len(lifecycle.Transitions))
  21. for _, trans := range lifecycle.Transitions {
  22. t := transition{
  23. Days: trans.Days,
  24. StorageClass: trans.StorageClass,
  25. }
  26. if !trans.Date.IsZero() {
  27. t.Date = trans.Date.Format(time.RFC3339)
  28. }
  29. transitionList = append(transitionList, t)
  30. }
  31. lifecycleInput = append(lifecycleInput, lifecycleRule{
  32. ID: lifecycle.ID,
  33. Prefix: lifecycle.Prefix,
  34. Status: lifecycle.Status,
  35. Transitions: transitionList,
  36. Expiration: exp,
  37. NonCurrentVersionTransition: lifecycle.NonCurrentVersionTransition,
  38. NoCurrentVersionExpiration: lifecycle.NoCurrentVersionExpiration,
  39. Tag: lifecycle.Tag,
  40. AbortInCompleteMultipartUpload: lifecycle.AbortInCompleteMultipartUpload,
  41. })
  42. }
  43. return putBucketLifecycleInput{Rules: lifecycleInput}
  44. }
  45. func (cli *ClientV2) PutBucketLifecycle(ctx context.Context, input *PutBucketLifecycleInput) (*PutLifecycleOutput, error) {
  46. if input == nil {
  47. return nil, InputIsNilClientError
  48. }
  49. if err := isValidBucketName(input.Bucket, cli.isCustomDomain); err != nil {
  50. return nil, err
  51. }
  52. data, contentMD5, err := marshalInput("PutBucketLifecycleInput", cli.parseLifecycleInput(input))
  53. if err != nil {
  54. return nil, err
  55. }
  56. res, err := cli.newBuilder(input.Bucket, "").
  57. WithQuery("lifecycle", "").
  58. WithHeader(HeaderContentMD5, contentMD5).
  59. WithRetry(OnRetryFromStart, StatusCodeClassifier{}).
  60. Request(ctx, http.MethodPut, bytes.NewReader(data), cli.roundTripper(http.StatusOK))
  61. if err != nil {
  62. return nil, err
  63. }
  64. defer res.Close()
  65. output := PutLifecycleOutput{RequestInfo: res.RequestInfo()}
  66. return &output, nil
  67. }
  68. func (cli *ClientV2) GetBucketLifecycle(ctx context.Context, input *GetBucketLifecycleInput) (*GetBucketLifecycleOutput, error) {
  69. if input == nil {
  70. return nil, InputIsNilClientError
  71. }
  72. if err := isValidBucketName(input.Bucket, cli.isCustomDomain); err != nil {
  73. return nil, err
  74. }
  75. res, err := cli.newBuilder(input.Bucket, "").
  76. WithQuery("lifecycle", "").
  77. WithRetry(nil, StatusCodeClassifier{}).
  78. Request(ctx, http.MethodGet, nil, cli.roundTripper(http.StatusOK))
  79. if err != nil {
  80. return nil, err
  81. }
  82. defer res.Close()
  83. output := GetBucketLifecycleOutput{RequestInfo: res.RequestInfo()}
  84. if err = marshalOutput(output.RequestID, res.Body, &output); err != nil {
  85. return nil, err
  86. }
  87. return &output, nil
  88. }
  89. func (cli *ClientV2) DeleteBucketLifecycle(ctx context.Context, input *DeleteBucketLifecycleInput) (*DeleteBucketLifecycleOutput, error) {
  90. if input == nil {
  91. return nil, InputIsNilClientError
  92. }
  93. if err := isValidBucketName(input.Bucket, cli.isCustomDomain); err != nil {
  94. return nil, err
  95. }
  96. res, err := cli.newBuilder(input.Bucket, "").
  97. WithQuery("lifecycle", "").
  98. WithRetry(nil, StatusCodeClassifier{}).
  99. Request(ctx, http.MethodDelete, nil, cli.roundTripper(http.StatusNoContent))
  100. if err != nil {
  101. return nil, err
  102. }
  103. defer res.Close()
  104. output := DeleteBucketLifecycleOutput{RequestInfo: res.RequestInfo()}
  105. return &output, nil
  106. }