Skip to content

Commit 2baec15

Browse files
authored
Merge pull request #280 from tencentyun/feature_jojoliang_2e155105
Feature jojoliang 2e155105
2 parents 17ebcc9 + 74f414d commit 2baec15

12 files changed

+1100
-24
lines changed

bucket.go

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package cos
22

33
import (
4+
"bytes"
45
"context"
56
"encoding/xml"
7+
"errors"
68
"net/http"
79
)
810

@@ -212,3 +214,153 @@ func (s *BucketService) GetObjectVersions(ctx context.Context, opt *BucketGetObj
212214
resp, err := s.client.doRetry(ctx, &sendOpt)
213215
return &res, resp, err
214216
}
217+
218+
type BucketGetMetadataResult struct {
219+
BucketUrl string
220+
BucketName string
221+
Location string
222+
MAZ bool
223+
OFS bool
224+
Encryption *BucketGetEncryptionResult
225+
ACL *BucketGetACLResult
226+
Website *BucketGetWebsiteResult
227+
Logging *BucketGetLoggingResult
228+
CORS *BucketGetCORSResult
229+
Versioning *BucketGetVersionResult
230+
Lifecycle *BucketGetLifecycleResult
231+
IntelligentTiering *ListIntelligentTieringConfigurations
232+
Tagging *BucketGetTaggingResult
233+
ObjectLock *BucketGetObjectLockResult
234+
Replication *BucketGetReplicationResult
235+
}
236+
237+
func (s *BucketService) GetMeta(ctx context.Context, bucket ...string) (*BucketGetMetadataResult, *Response, error) {
238+
if s.client.BaseURL.BucketURL == nil {
239+
return nil, nil, errors.New("BucketURL is empty")
240+
}
241+
var customDomain bool
242+
if !hostPrefix.MatchString(s.client.BaseURL.BucketURL.String()) {
243+
customDomain = true
244+
if len(bucket) == 0 || !bucketChecker.MatchString(bucket[0]) {
245+
return nil, nil, errors.New("you must provide bucket-appid param in using custom domain")
246+
}
247+
}
248+
var err error
249+
var resp *Response
250+
var res BucketGetMetadataResult
251+
252+
resp, err = s.Head(ctx)
253+
if err != nil {
254+
return nil, resp, err
255+
}
256+
// 非自定义域名
257+
if !customDomain {
258+
res.BucketName, res.Location = GetBucketRegionFromUrl(s.client.BaseURL.BucketURL)
259+
} else {
260+
res.BucketName, res.Location = bucket[0], resp.Header.Get("X-Cos-Bucket-Region")
261+
}
262+
w := bytes.NewBuffer(nil)
263+
bucketURLTemplate.Execute(w, struct {
264+
Schema string
265+
BucketName string
266+
Region string
267+
}{"https", res.BucketName, res.Location})
268+
res.BucketUrl = w.String()
269+
270+
if resp.Header.Get("X-Cos-Bucket-Az-Type") == "MAZ" {
271+
res.MAZ = true
272+
}
273+
if resp.Header.Get("X-Cos-Bucket-Arch") == "OFS" {
274+
res.OFS = true
275+
}
276+
277+
res.Encryption, resp, err = s.GetEncryption(ctx)
278+
if err != nil {
279+
if IsNotFoundError(err) {
280+
res.Encryption = nil
281+
} else {
282+
return nil, resp, err
283+
}
284+
}
285+
res.ACL, resp, err = s.GetACL(ctx)
286+
if err != nil {
287+
if IsNotFoundError(err) {
288+
res.ACL = nil
289+
} else {
290+
return nil, resp, err
291+
}
292+
}
293+
res.Website, resp, err = s.GetWebsite(ctx)
294+
if err != nil {
295+
if IsNotFoundError(err) {
296+
res.Website = nil
297+
} else {
298+
return nil, resp, err
299+
}
300+
}
301+
res.Logging, resp, err = s.GetLogging(ctx)
302+
if err != nil {
303+
if IsNotFoundError(err) {
304+
res.Logging = nil
305+
} else {
306+
return nil, resp, err
307+
}
308+
}
309+
res.CORS, resp, err = s.GetCORS(ctx)
310+
if err != nil {
311+
if IsNotFoundError(err) {
312+
res.CORS = nil
313+
} else {
314+
return nil, resp, err
315+
}
316+
}
317+
res.Versioning, resp, err = s.GetVersioning(ctx)
318+
if err != nil {
319+
if IsNotFoundError(err) {
320+
res.Versioning = nil
321+
} else {
322+
return nil, resp, err
323+
}
324+
}
325+
res.Lifecycle, resp, err = s.GetLifecycle(ctx)
326+
if err != nil {
327+
if IsNotFoundError(err) {
328+
res.Lifecycle = nil
329+
} else {
330+
return nil, resp, err
331+
}
332+
}
333+
res.IntelligentTiering, resp, err = s.ListIntelligentTiering(ctx)
334+
if err != nil {
335+
if IsNotFoundError(err) {
336+
res.IntelligentTiering = nil
337+
} else {
338+
return nil, resp, err
339+
}
340+
}
341+
res.Tagging, resp, err = s.GetTagging(ctx)
342+
if err != nil {
343+
if IsNotFoundError(err) {
344+
res.Tagging = nil
345+
} else {
346+
return nil, resp, err
347+
}
348+
}
349+
res.ObjectLock, resp, err = s.GetObjectLockConfiguration(ctx)
350+
if err != nil {
351+
if IsNotFoundError(err) {
352+
res.ObjectLock = nil
353+
} else {
354+
return nil, resp, err
355+
}
356+
}
357+
res.Replication, resp, err = s.GetBucketReplication(ctx)
358+
if err != nil {
359+
if IsNotFoundError(err) {
360+
res.Replication = nil
361+
} else {
362+
return nil, resp, err
363+
}
364+
}
365+
return &res, resp, nil
366+
}

bucket_intelligenttiering.go

Lines changed: 90 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,38 @@ package cos
33
import (
44
"context"
55
"encoding/xml"
6+
"errors"
67
"net/http"
78
)
89

10+
type BucketIntelligentTieringFilterAnd struct {
11+
Prefix string `xml:"Prefix,omitempty" header:"-"`
12+
Tag []*BucketTaggingTag `xml:"Tag,omitempty" header:"-"`
13+
}
14+
15+
type BucketIntelligentTieringFilter struct {
16+
And *BucketIntelligentTieringFilterAnd `xml:"And,omitempty" header:"-"`
17+
Prefix string `xml:"Prefix,omitempty" header:"-"`
18+
Tag []*BucketTaggingTag `xml:"Tag,omitempty" header:"-"`
19+
}
20+
921
type BucketIntelligentTieringTransition struct {
10-
Days int `xml:"Days,omitempty" header:"-"`
11-
RequestFrequent int `xml:"RequestFrequent,omitempty" header:"-"`
22+
AccessTier string `xml:"AccessTier,omitempty" header:"-"`
23+
Days int `xml:"Days,omitempty" header:"-"`
24+
RequestFrequent int `xml:"RequestFrequent,omitempty" header:"-"`
1225
}
1326

1427
type BucketPutIntelligentTieringOptions struct {
15-
XMLName xml.Name `xml:"IntelligentTieringConfiguration" header:"-"`
16-
Status string `xml:"Status,omitempty" header:"-"`
17-
Transition *BucketIntelligentTieringTransition `xml:"Transition,omitempty" header:"-"`
18-
XOptionHeader *http.Header `header:"-,omitempty" url:"-" xml:"-"`
28+
XMLName xml.Name `xml:"IntelligentTieringConfiguration" header:"-"`
29+
Status string `xml:"Status,omitempty" header:"-"`
30+
Transition *BucketIntelligentTieringTransition `xml:"Transition,omitempty" header:"-"`
31+
32+
// V2
33+
Id string `xml:"Id,omitempty" header:"-"`
34+
Tiering []*BucketIntelligentTieringTransition `xml:"Tiering,omitempty" header:"-"`
35+
Filter *BucketIntelligentTieringFilter `xml:"Filter,omitempty" header:"-"`
36+
37+
XOptionHeader *http.Header `header:"-,omitempty" url:"-" xml:"-"`
1938
}
2039

2140
type BucketGetIntelligentTieringResult BucketPutIntelligentTieringOptions
@@ -24,6 +43,18 @@ type BucketGetIntelligentTieringOptions struct {
2443
XOptionHeader *http.Header `header:"-,omitempty" url:"-" xml:"-"`
2544
}
2645

46+
type IntelligentTieringConfiguration struct {
47+
Id string `xml:"Id"`
48+
Status string `xml:"Status"`
49+
Tiering []*BucketIntelligentTieringTransition `xml:"Tiering"`
50+
Filter *BucketIntelligentTieringFilter `xml:"Filter,omitempty"`
51+
}
52+
53+
type ListIntelligentTieringConfigurations struct {
54+
XMLName xml.Name `xml:"ListBucketIntelligentTieringConfigurationsOutput"`
55+
Configurations []*IntelligentTieringConfiguration `xml:"IntelligentTieringConfiguration,omitempty"`
56+
}
57+
2758
func (s *BucketService) PutIntelligentTiering(ctx context.Context, opt *BucketPutIntelligentTieringOptions) (*Response, error) {
2859
if opt != nil && opt.Transition != nil {
2960
opt.Transition.RequestFrequent = 1
@@ -54,5 +85,58 @@ func (s *BucketService) GetIntelligentTiering(ctx context.Context, opt ...*Bucke
5485
}
5586
resp, err := s.client.doRetry(ctx, &sendOpt)
5687
return &res, resp, err
88+
}
89+
90+
func (s *BucketService) PutIntelligentTieringV2(ctx context.Context, opt *BucketPutIntelligentTieringOptions) (*Response, error) {
91+
if opt == nil || opt.Id == "" {
92+
return nil, errors.New("id is empty")
93+
}
94+
sendOpt := sendOptions{
95+
baseURL: s.client.BaseURL.BucketURL,
96+
uri: "/?intelligent-tiering&id=" + opt.Id,
97+
method: http.MethodPut,
98+
optHeader: opt,
99+
body: opt,
100+
}
101+
resp, err := s.client.doRetry(ctx, &sendOpt)
102+
return resp, err
103+
}
104+
105+
func (s *BucketService) GetIntelligentTieringV2(ctx context.Context, id string, opt ...*BucketGetIntelligentTieringOptions) (*BucketGetIntelligentTieringResult, *Response, error) {
106+
var optHeader *BucketGetIntelligentTieringOptions
107+
if len(opt) > 0 {
108+
optHeader = opt[0]
109+
}
110+
var res BucketGetIntelligentTieringResult
111+
sendOpt := sendOptions{
112+
baseURL: s.client.BaseURL.BucketURL,
113+
uri: "/?intelligent-tiering&id=" + id,
114+
method: http.MethodGet,
115+
optHeader: optHeader,
116+
result: &res,
117+
}
118+
resp, err := s.client.doRetry(ctx, &sendOpt)
119+
return &res, resp, err
120+
}
121+
122+
func (s *BucketService) ListIntelligentTiering(ctx context.Context) (*ListIntelligentTieringConfigurations, *Response, error) {
123+
var res ListIntelligentTieringConfigurations
124+
sendOpt := sendOptions{
125+
baseURL: s.client.BaseURL.BucketURL,
126+
uri: "/?intelligent-tiering",
127+
method: http.MethodGet,
128+
result: &res,
129+
}
130+
resp, err := s.client.doRetry(ctx, &sendOpt)
131+
return &res, resp, err
132+
}
57133

134+
func (s *BucketService) DeleteIntelligentTiering(ctx context.Context, id string) (*Response, error) {
135+
sendOpt := sendOptions{
136+
baseURL: s.client.BaseURL.BucketURL,
137+
uri: "/?intelligent-tiering&id=" + id,
138+
method: http.MethodDelete,
139+
}
140+
resp, err := s.client.doRetry(ctx, &sendOpt)
141+
return resp, err
58142
}

0 commit comments

Comments
 (0)