From c131870916d7c29eb8c4a9512ea59ed7d7b09e18 Mon Sep 17 00:00:00 2001 From: toranger Date: Fri, 26 Apr 2019 19:09:48 +0800 Subject: [PATCH 1/4] Support Versioning, Replication, Inventory and Logging api --- bucket_inventory.go | 132 ++++++++++++++++++++++++++++++++++ bucket_logging.go | 51 +++++++++++++ bucket_replication.go | 73 +++++++++++++++++++ bucket_version.go | 45 ++++++++++++ costesting/ci_test.go | 96 ++++++++++++++++++++++++- example/bucket/deleteInventory.go | 37 ++++++++++ example/bucket/deleteReplication.go | 36 ++++++++++ example/bucket/getInventory.go | 38 ++++++++++ example/bucket/getLogging.go | 41 +++++++++++ example/bucket/getReplication.go | 41 +++++++++++ example/bucket/getVersioning.go | 39 ++++++++++ example/bucket/listInventoryConfig.go | 40 +++++++++++ example/bucket/putInventory.go | 61 ++++++++++++++++ example/bucket/putLogging.go | 43 +++++++++++ example/bucket/putReplication.go | 51 +++++++++++++ example/bucket/putVersioning.go | 41 +++++++++++ 16 files changed, 864 insertions(+), 1 deletion(-) create mode 100644 bucket_inventory.go create mode 100644 bucket_logging.go create mode 100644 bucket_replication.go create mode 100644 bucket_version.go create mode 100644 example/bucket/deleteInventory.go create mode 100644 example/bucket/deleteReplication.go create mode 100644 example/bucket/getInventory.go create mode 100644 example/bucket/getLogging.go create mode 100644 example/bucket/getReplication.go create mode 100644 example/bucket/getVersioning.go create mode 100644 example/bucket/listInventoryConfig.go create mode 100644 example/bucket/putInventory.go create mode 100644 example/bucket/putLogging.go create mode 100644 example/bucket/putReplication.go create mode 100644 example/bucket/putVersioning.go diff --git a/bucket_inventory.go b/bucket_inventory.go new file mode 100644 index 0000000..65b58ed --- /dev/null +++ b/bucket_inventory.go @@ -0,0 +1,132 @@ +package cos + +import ( + "context" + "encoding/xml" + "fmt" + "net/http" +) + +// BucketGetInventoryResult same struct to options +type BucketGetInventoryResult BucketPutInventoryOptions + +// BucketListInventoryConfiguartion same struct to options +type BucketListInventoryConfiguartion BucketPutInventoryOptions + +// BucketInventoryFilter ... +type BucketInventoryFilter struct { + Prefix string `xml:"Prefix,omitempty"` +} + +// BucketInventoryOptionalFields ... +type BucketInventoryOptionalFields struct { + XMLName xml.Name `xml:"OptionalFields,omitempty"` + BucketInventoryFields []string `xml:"Field,omitempty"` +} + +// BucketInventorySchedule ... +type BucketInventorySchedule struct { + Frequency string `xml:"Frequency"` +} + +// BucketInventoryEncryption ... +type BucketInventoryEncryption struct { + XMLName xml.Name `xml:"Encryption"` + SSECOS string `xml:"SSE-COS,omitempty"` +} + +// BucketInventoryDestinationContent ... +type BucketInventoryDestinationContent struct { + Bucket string `xml:"Bucket"` + AccountId string `xml:"AccountId,omitempty"` + Prefix string `xml:"Prefix,omitempty"` + Format string `xml:"Format"` + Encryption *BucketInventoryEncryption `xml:"Encryption,omitempty"` +} + +// BucketInventoryDestination ... +type BucketInventoryDestination struct { + XMLName xml.Name `xml:"Destination"` + BucketDestination *BucketInventoryDestinationContent `xml:"COSBucketDestination"` +} + +// BucketPutInventoryOptions ... +type BucketPutInventoryOptions struct { + XMLName xml.Name `xml:"InventoryConfiguration"` + ID string `xml:"Id"` + IsEnabled string `xml:"IsEnabled"` + IncludedObjectVersions string `xml:"IncludedObjectVersions"` + Filter *BucketInventoryFilter `xml:"Filter,omitempty"` + OptionalFields *BucketInventoryOptionalFields `xml:"OptionalFields,omitempty"` + Schedule *BucketInventorySchedule `xml:"Schedule"` + Destination *BucketInventoryDestination `xml:"Destination"` +} + +// ListBucketInventoryConfigResult result of ListBucketInventoryConfiguration +type ListBucketInventoryConfigResult struct { + XMLName xml.Name `xml:"ListInventoryConfigurationResult"` + InventoryConfigurations []BucketListInventoryConfiguartion `xml:"InventoryConfiguration,omitempty"` + IsTruncated bool `xml:"IsTruncated,omitempty"` + ContinuationToken string `xml:"ContinuationToken,omitempty"` + NextContinuationToken string `xml:"NextContinuationToken,omitempty"` +} + +// PutBucketInventory https://cloud.tencent.com/document/product/436/33707 +func (s *BucketService) PutBucketInventory(ctx context.Context, id string, opt *BucketPutInventoryOptions) (*Response, error) { + u := fmt.Sprintf("/?inventory&id=%s", id) + sendOpt := sendOptions{ + baseURL: s.client.BaseURL.BucketURL, + uri: u, + method: http.MethodPut, + body: opt, + } + resp, err := s.client.send(ctx, &sendOpt) + return resp, err + +} + +// GetBucketInventory https://cloud.tencent.com/document/product/436/33705 +func (s *BucketService) GetBucketInventory(ctx context.Context, id string) (*BucketGetInventoryResult, *Response, error) { + u := fmt.Sprintf("/?inventory&id=%s", id) + var res BucketGetInventoryResult + sendOpt := sendOptions{ + baseURL: s.client.BaseURL.BucketURL, + uri: u, + method: http.MethodGet, + result: &res, + } + resp, err := s.client.send(ctx, &sendOpt) + return &res, resp, err +} + +// DeleteBucketInventory https://cloud.tencent.com/document/product/436/33704 +func (s *BucketService) DeleteBucketInventory(ctx context.Context, id string) (*Response, error) { + u := fmt.Sprintf("/?inventory&id=%s", id) + sendOpt := sendOptions{ + baseURL: s.client.BaseURL.BucketURL, + uri: u, + method: http.MethodDelete, + } + resp, err := s.client.send(ctx, &sendOpt) + return resp, err +} + +// ListBucketInventoryConfigurations https://cloud.tencent.com/document/product/436/33706 +func (s *BucketService) ListBucketInventoryConfigurations(ctx context.Context, token string) (*ListBucketInventoryConfigResult, *Response, error) { + var res ListBucketInventoryConfigResult + var u string + if token == "" { + u = "/?inventory" + } else { + u = fmt.Sprintf("/?inventory&continuation-token=%s", encodeURIComponent(token)) + } + sendOpt := sendOptions{ + baseURL: s.client.BaseURL.BucketURL, + uri: u, + method: http.MethodGet, + result: &res, + } + resp, err := s.client.send(ctx, &sendOpt) + return &res, resp, err + +} diff --git a/bucket_logging.go b/bucket_logging.go new file mode 100644 index 0000000..5bb79a2 --- /dev/null +++ b/bucket_logging.go @@ -0,0 +1,51 @@ +package cos + +import ( + "context" + "encoding/xml" + "net/http" +) + +// BucketLoggingEnabled main struct of logging +type BucketLoggingEnabled struct { + TargetBucket string `xml:"TargetBucket"` + TargetPrefix string `xml:"TargetPrefix"` +} + +// BucketPutLoggingOptions is the options of PutBucketLogging +type BucketPutLoggingOptions struct { + XMLName xml.Name `xml:"BucketLoggingStatus"` + LoggingEnabled *BucketLoggingEnabled `xml:"LoggingEnabled"` +} + +// BucketGetLoggingResult is the result of GetBucketLogging +type BucketGetLoggingResult struct { + XMLName xml.Name `xml:"BucketLoggingStatus"` + LoggingEnabled *BucketLoggingEnabled `xml:"LoggingEnabled"` +} + +// PutBucketLogging https://cloud.tencent.com/document/product/436/17054 +func (s *BucketService) PutBucketLogging(ctx context.Context, opt *BucketPutLoggingOptions) (*Response, error) { + sendOpt := sendOptions{ + baseURL: s.client.BaseURL.BucketURL, + uri: "/?logging", + method: http.MethodPut, + body: opt, + } + resp, err := s.client.send(ctx, &sendOpt) + return resp, err +} + +// GetBucketLogging https://cloud.tencent.com/document/product/436/17053 +func (s *BucketService) GetBucketLogging(ctx context.Context) (*BucketGetLoggingResult, *Response, error) { + var res BucketGetLoggingResult + sendOpt := sendOptions{ + baseURL: s.client.BaseURL.BucketURL, + uri: "/?logging", + method: http.MethodGet, + result: &res, + } + resp, err := s.client.send(ctx, &sendOpt) + return &res, resp, err + +} diff --git a/bucket_replication.go b/bucket_replication.go new file mode 100644 index 0000000..d0a1a9a --- /dev/null +++ b/bucket_replication.go @@ -0,0 +1,73 @@ +package cos + +import ( + "context" + "encoding/xml" + "net/http" +) + +// ReplicationDestination is the sub struct of BucketReplicationRule +type ReplicationDestination struct { + Bucket string `xml:"Bucket"` + StorageClass string `xml:"StorageClass,omitempty"` +} + +// BucketReplicationRule is the main param of replication +type BucketReplicationRule struct { + ID string `xml:"ID,omitempty"` + Status string `xml:"Status"` + Prefix string `xml:"Prefix"` + Destination *ReplicationDestination `xml:"Destination"` +} + +// PutBucketReplicationOptions is the options of PutBucketReplication +type PutBucketReplicationOptions struct { + XMLName xml.Name `xml:"ReplicationConfiguration"` + Role string `xml:"Role"` + Rule []BucketReplicationRule `xml:"Rule"` +} + +// GetBucketReplicationResult is the result of GetBucketReplication +type GetBucketReplicationResult struct { + XMLName xml.Name `xml:"ReplicationConfiguration"` + Role string `xml:"Role"` + Rule []BucketReplicationRule `xml:"Rule"` +} + +// PutBucketReplication https://cloud.tencent.com/document/product/436/19223 +func (s *BucketService) PutBucketReplication(ctx context.Context, opt *PutBucketReplicationOptions) (*Response, error) { + sendOpt := sendOptions{ + baseURL: s.client.BaseURL.BucketURL, + uri: "/?replication", + method: http.MethodPut, + body: opt, + } + resp, err := s.client.send(ctx, &sendOpt) + return resp, err + +} + +// GetBucketReplication https://cloud.tencent.com/document/product/436/19222 +func (s *BucketService) GetBucketReplication(ctx context.Context) (*GetBucketReplicationResult, *Response, error) { + var res GetBucketReplicationResult + sendOpt := sendOptions{ + baseURL: s.client.BaseURL.BucketURL, + uri: "/?replication", + method: http.MethodGet, + result: &res, + } + resp, err := s.client.send(ctx, &sendOpt) + return &res, resp, err + +} + +// DeleteBucketReplication https://cloud.tencent.com/document/product/436/19221 +func (s *BucketService) DeleteBucketReplication(ctx context.Context) (*Response, error) { + sendOpt := sendOptions{ + baseURL: s.client.BaseURL.BucketURL, + uri: "/?replication", + method: http.MethodDelete, + } + resp, err := s.client.send(ctx, &sendOpt) + return resp, err +} diff --git a/bucket_version.go b/bucket_version.go new file mode 100644 index 0000000..b74527b --- /dev/null +++ b/bucket_version.go @@ -0,0 +1,45 @@ +package cos + +import ( + "context" + "encoding/xml" + "net/http" +) + +// BucketPutVersionOptions is the options of PutBucketVersioning +type BucketPutVersionOptions struct { + XMLName xml.Name `xml:"VersioningConfiguration"` + Status string `xml:"Status"` +} + +// BucketGetVersionResult is the result of GetBucketVersioning +type BucketGetVersionResult struct { + XMLName xml.Name `xml:"VersioningConfiguration"` + Status string `xml:"Status"` +} + +// PutVersion https://cloud.tencent.com/document/product/436/19889 +// Status has Suspended\Enabled +func (s *BucketService) PutVersioning(ctx context.Context, opt *BucketPutVersionOptions) (*Response, error) { + sendOpt := sendOptions{ + baseURL: s.client.BaseURL.BucketURL, + uri: "/?versioning", + method: http.MethodPut, + body: opt, + } + resp, err := s.client.send(ctx, &sendOpt) + return resp, err +} + +// GetVersion https://cloud.tencent.com/document/product/436/19888 +func (s *BucketService) GetVersioning(ctx context.Context) (*BucketGetVersionResult, *Response, error) { + var res BucketGetVersionResult + sendOpt := sendOptions{ + baseURL: s.client.BaseURL.BucketURL, + uri: "/?versioning", + method: http.MethodGet, + result: &res, + } + resp, err := s.client.send(ctx, &sendOpt) + return &res, resp, err +} diff --git a/costesting/ci_test.go b/costesting/ci_test.go index 2db4e04..90a7e67 100644 --- a/costesting/ci_test.go +++ b/costesting/ci_test.go @@ -185,6 +185,100 @@ func (s *CosTestSuite) TestPutGetDeleteCORS() { assert.Equal(s.T(), 1, len(v.Rules), "GetBucketCORS wrong number rules") } +func (s *CosTestSuite) TestVersionAndReplication() { + opt := &cos.BucketPutVersionOptions{ + // Enabled or Suspended, the versioning once opened can not close. + Status: "Enabled", + } + _, err := s.Client.Bucket.PutVersioning(context.Background(), opt) + assert.Nil(s.T(), err, "PutVersioning Failed") + v, _, err := s.Client.Bucket.GetVersioning(context.Background()) + assert.Nil(s.T(), err, "GetVersioning Failed") + assert.Equal(s.T(), "Enabled", v.Status, "Get Wrong Version status") + + repOpt := &cos.PutBucketReplicationOptions{ + // qcs::cam::uin/[UIN]:uin/[Subaccount] + Role: "qcs::cam::uin/2779643970:uin/2779643970", + Rule: []cos.BucketReplicationRule{ + { + ID: "1", + // Enabled or Disabled + Status: "Enabled", + Destination: &cos.ReplicationDestination{ + // qcs::cos:[Region]::[Bucketname-Appid] + Bucket: "qcs::cos:ap-beijing::alanbj-1251668577", + }, + }, + }, + } + + _, err = s.Client.Bucket.PutBucketReplication(context.Background(), repOpt) + assert.Nil(s.T(), err, "PutBucketReplication Failed") + vr, _, err := s.Client.Bucket.GetBucketReplication(context.Background()) + assert.Nil(s.T(), err, "GetBucketReplication Failed") + for _, r := range vr.Rule { + assert.Equal(s.T(), "Enabled", r.Status, "Get Wrong Version status") + assert.Equal(s.T(), "qcs::cos:ap-beijing::alanbj-1251668577", r.Destination.Bucket, "Get Wrong Version status") + + } + _, err = s.Client.Bucket.DeleteBucketReplication(context.Background()) + assert.Nil(s.T(), err, "DeleteBucketReplication Failed") +} + +func (s *CosTestSuite) TestBucketInventory() { + id := "test1" + opt := &cos.BucketPutInventoryOptions{ + ID: id, + // True or False + IsEnabled: "True", + IncludedObjectVersions: "All", + Filter: &cos.BucketInventoryFilter{ + Prefix: "test", + }, + OptionalFields: &cos.BucketInventoryOptionalFields{ + BucketInventoryFields: []string{ + "Size", "LastModifiedDate", + }, + }, + Schedule: &cos.BucketInventorySchedule{ + // Weekly or Daily + Frequency: "Daily", + }, + Destination: &cos.BucketInventoryDestination{ + BucketDestination: &cos.BucketInventoryDestinationContent{ + Bucket: "qcs::cos:ap-guangzhou::alangz-1251668577", + Format: "CSV", + }, + }, + } + _, err := s.Client.Bucket.PutBucketInventory(context.Background(), id, opt) + assert.Nil(s.T(), err, "PutBucketInventory Failed") + v, _, err := s.Client.Bucket.GetBucketInventory(context.Background(), id) + assert.Nil(s.T(), err, "GetBucketInventory Failed") + assert.Equal(s.T(), "test1", v.ID, "Get Wrong inventory id") + assert.Equal(s.T(), "True", v.IsEnabled, "Get Wrong inventory isenabled") + assert.Equal(s.T(), "qcs::cos:ap-guangzhou::alangz-1251668577", v.Destination.BucketDestination.Bucket, "Get Wrong inventory isenabled") + + _, err = s.Client.Bucket.DeleteBucketInventory(context.Background(), id) + assert.Nil(s.T(), err, "DeleteBucketInventory Failed") + +} + +func (s *CosTestSuite) TestBucketLogging() { + opt := &cos.BucketPutLoggingOptions{ + LoggingEnabled: &cos.BucketLoggingEnabled{ + // The bucket must same region. + TargetBucket: "alangz-1251668577", + }, + } + _, err := s.Client.Bucket.PutBucketLogging(context.Background(), opt) + assert.Nil(s.T(), err, "PutBucketLogging Failed") + v, _, err := s.Client.Bucket.GetBucketLogging(context.Background()) + assert.Nil(s.T(), err, "GetBucketLogging Failed") + assert.Equal(s.T(), "alangz-1251668577", v.LoggingEnabled.TargetBucket, "Get Wrong Version status") + +} + func (s *CosTestSuite) TestPutGetDeleteLifeCycle() { lc := &cos.BucketPutLifecycleOptions{ Rules: []cos.BucketLifecycleRule{ @@ -351,7 +445,7 @@ func (s *CosTestSuite) TestPutObjectRestore() { Tier: "Expedited", }, } - resp, _ := s.Client.Object.PutRestore(context.Background(), name, opt) + resp, _ := s.Client.Object.PostRestore(context.Background(), name, opt) retCode := resp.StatusCode if retCode != 200 && retCode != 202 && retCode != 409 { right := false diff --git a/example/bucket/deleteInventory.go b/example/bucket/deleteInventory.go new file mode 100644 index 0000000..442d034 --- /dev/null +++ b/example/bucket/deleteInventory.go @@ -0,0 +1,37 @@ +package main + +import ( + "context" + "net/url" + "os" + + "net/http" + + "github.com/tencentyun/cos-go-sdk-v5" + "github.com/tencentyun/cos-go-sdk-v5/debug" +) + +func main() { + u, _ := url.Parse("https://alangz-1251668577.cos.ap-guangzhou.myqcloud.com") + b := &cos.BaseURL{ + BucketURL: u, + } + c := cos.NewClient(b, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: os.Getenv("COS_SECRETID"), + SecretKey: os.Getenv("COS_SECRETKEY"), + Transport: &debug.DebugRequestTransport{ + RequestHeader: true, + RequestBody: true, + ResponseHeader: true, + ResponseBody: true, + }, + }, + }) + + id := "test1" + _, err := c.Bucket.DeleteBucketInventory(context.Background(), id) + if err != nil { + panic(err) + } +} diff --git a/example/bucket/deleteReplication.go b/example/bucket/deleteReplication.go new file mode 100644 index 0000000..9f9794b --- /dev/null +++ b/example/bucket/deleteReplication.go @@ -0,0 +1,36 @@ +package main + +import ( + "context" + "net/url" + "os" + + "net/http" + + "github.com/tencentyun/cos-go-sdk-v5" + "github.com/tencentyun/cos-go-sdk-v5/debug" +) + +func main() { + u, _ := url.Parse("https://alanbj-1251668577.cos.ap-beijing.myqcloud.com") + b := &cos.BaseURL{ + BucketURL: u, + } + c := cos.NewClient(b, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: os.Getenv("COS_SECRETID"), + SecretKey: os.Getenv("COS_SECRETKEY"), + Transport: &debug.DebugRequestTransport{ + RequestHeader: true, + RequestBody: true, + ResponseHeader: true, + ResponseBody: true, + }, + }, + }) + + _, err := c.Bucket.DeleteBucketReplication(context.Background()) + if err != nil { + panic(err) + } +} diff --git a/example/bucket/getInventory.go b/example/bucket/getInventory.go new file mode 100644 index 0000000..fa5768c --- /dev/null +++ b/example/bucket/getInventory.go @@ -0,0 +1,38 @@ +package main + +import ( + "context" + "net/url" + "os" + + "net/http" + + "github.com/tencentyun/cos-go-sdk-v5" + "github.com/tencentyun/cos-go-sdk-v5/debug" +) + +func main() { + u, _ := url.Parse("https://alangz-1251668577.cos.ap-guangzhou.myqcloud.com") + // u, _ := url.Parse("https://test-1253846586.cos.ap-guangzhou.myqcloud.com") + b := &cos.BaseURL{ + BucketURL: u, + } + c := cos.NewClient(b, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: os.Getenv("COS_SECRETID"), + SecretKey: os.Getenv("COS_SECRETKEY"), + Transport: &debug.DebugRequestTransport{ + RequestHeader: true, + RequestBody: true, + ResponseHeader: true, + ResponseBody: true, + }, + }, + }) + + id := "test1" + _, _, err := c.Bucket.GetBucketInventory(context.Background(), id) + if err != nil { + panic(err) + } +} diff --git a/example/bucket/getLogging.go b/example/bucket/getLogging.go new file mode 100644 index 0000000..4254321 --- /dev/null +++ b/example/bucket/getLogging.go @@ -0,0 +1,41 @@ +package main + +import ( + "context" + "fmt" + "net/url" + "os" + + "net/http" + + "github.com/tencentyun/cos-go-sdk-v5" + "github.com/tencentyun/cos-go-sdk-v5/debug" +) + +func main() { + u, _ := url.Parse("https://alangz-1251668577.cos.ap-guangzhou.myqcloud.com") + b := &cos.BaseURL{ + BucketURL: u, + } + c := cos.NewClient(b, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: os.Getenv("COS_SECRETID"), + SecretKey: os.Getenv("COS_SECRETKEY"), + Transport: &debug.DebugRequestTransport{ + RequestHeader: true, + RequestBody: true, + ResponseHeader: true, + ResponseBody: true, + }, + }, + }) + + v, _, err := c.Bucket.GetBucketLogging(context.Background()) + if err != nil { + panic(err) + } + + if v.LoggingEnabled != nil { + fmt.Printf("target bucket is %s \n", v.LoggingEnabled.TargetBucket) + } +} diff --git a/example/bucket/getReplication.go b/example/bucket/getReplication.go new file mode 100644 index 0000000..8e77474 --- /dev/null +++ b/example/bucket/getReplication.go @@ -0,0 +1,41 @@ +package main + +import ( + "context" + "fmt" + "net/url" + "os" + + "net/http" + + "github.com/tencentyun/cos-go-sdk-v5" + "github.com/tencentyun/cos-go-sdk-v5/debug" +) + +func main() { + u, _ := url.Parse("https://alanbj-1251668577.cos.ap-beijing.myqcloud.com") + b := &cos.BaseURL{ + BucketURL: u, + } + c := cos.NewClient(b, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: os.Getenv("COS_SECRETID"), + SecretKey: os.Getenv("COS_SECRETKEY"), + Transport: &debug.DebugRequestTransport{ + RequestHeader: true, + RequestBody: true, + ResponseHeader: true, + ResponseBody: true, + }, + }, + }) + + v, _, err := c.Bucket.GetBucketReplication(context.Background()) + if err != nil { + panic(err) + } + for _, r := range v.Rule { + + fmt.Printf("%s, %s\n", r.Status, r.ID) + } +} diff --git a/example/bucket/getVersioning.go b/example/bucket/getVersioning.go new file mode 100644 index 0000000..f9a1aae --- /dev/null +++ b/example/bucket/getVersioning.go @@ -0,0 +1,39 @@ +package main + +import ( + "context" + "fmt" + "net/url" + "os" + + "net/http" + + "github.com/tencentyun/cos-go-sdk-v5" + "github.com/tencentyun/cos-go-sdk-v5/debug" +) + +func main() { + u, _ := url.Parse("https://alanbj-1251668577.cos.ap-beijing.myqcloud.com") + b := &cos.BaseURL{ + BucketURL: u, + } + c := cos.NewClient(b, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: os.Getenv("COS_SECRETID"), + SecretKey: os.Getenv("COS_SECRETKEY"), + Transport: &debug.DebugRequestTransport{ + RequestHeader: true, + RequestBody: true, + ResponseHeader: true, + ResponseBody: true, + }, + }, + }) + + v, _, err := c.Bucket.GetVersioning(context.Background()) + if err != nil { + panic(err) + } + + fmt.Printf("status is %s \n", v.Status) +} diff --git a/example/bucket/listInventoryConfig.go b/example/bucket/listInventoryConfig.go new file mode 100644 index 0000000..136c35f --- /dev/null +++ b/example/bucket/listInventoryConfig.go @@ -0,0 +1,40 @@ +package main + +import ( + "context" + "fmt" + "net/url" + "os" + + "net/http" + + "github.com/tencentyun/cos-go-sdk-v5" + "github.com/tencentyun/cos-go-sdk-v5/debug" +) + +func main() { + u, _ := url.Parse("https://alangz-1251668577.cos.ap-guangzhou.myqcloud.com") + b := &cos.BaseURL{ + BucketURL: u, + } + c := cos.NewClient(b, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: os.Getenv("COS_SECRETID"), + SecretKey: os.Getenv("COS_SECRETKEY"), + Transport: &debug.DebugRequestTransport{ + RequestHeader: true, + RequestBody: true, + ResponseHeader: true, + ResponseBody: true, + }, + }, + }) + + v, _, err := c.Bucket.ListBucketInventoryConfigurations(context.Background(), "") + if err != nil { + panic(err) + } + for _, p := range v.InventoryConfigurations { + fmt.Printf("%s\n", p.Destination.BucketDestination.Bucket) + } +} diff --git a/example/bucket/putInventory.go b/example/bucket/putInventory.go new file mode 100644 index 0000000..1101a0f --- /dev/null +++ b/example/bucket/putInventory.go @@ -0,0 +1,61 @@ +package main + +import ( + "context" + "net/url" + "os" + + "net/http" + + "github.com/tencentyun/cos-go-sdk-v5" + "github.com/tencentyun/cos-go-sdk-v5/debug" +) + +func main() { + u, _ := url.Parse("https://alangz-1251668577.cos.ap-guangzhou.myqcloud.com") + b := &cos.BaseURL{ + BucketURL: u, + } + c := cos.NewClient(b, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: os.Getenv("COS_SECRETID"), + SecretKey: os.Getenv("COS_SECRETKEY"), + Transport: &debug.DebugRequestTransport{ + RequestHeader: true, + RequestBody: true, + ResponseHeader: true, + ResponseBody: true, + }, + }, + }) + + id := "test1" + opt := &cos.BucketPutInventoryOptions{ + ID: id, + // True or False + IsEnabled: "True", + IncludedObjectVersions: "All", + Filter: &cos.BucketInventoryFilter{ + Prefix: "test", + }, + OptionalFields: &cos.BucketInventoryOptionalFields{ + BucketInventoryFields: []string{ + "Size", "LastModifiedDate", + }, + }, + Schedule: &cos.BucketInventorySchedule{ + // Weekly or Daily + Frequency: "Daily", + }, + Destination: &cos.BucketInventoryDestination{ + BucketDestination: &cos.BucketInventoryDestinationContent{ + Bucket: "qcs::cos:ap-guangzhou::alangz-1251668577", + Format: "CSV", + }, + }, + } + _, err := c.Bucket.PutBucketInventory(context.Background(), id, opt) + if err != nil { + panic(err) + } +} diff --git a/example/bucket/putLogging.go b/example/bucket/putLogging.go new file mode 100644 index 0000000..5d0167a --- /dev/null +++ b/example/bucket/putLogging.go @@ -0,0 +1,43 @@ +package main + +import ( + "context" + "net/url" + "os" + + "net/http" + + "github.com/tencentyun/cos-go-sdk-v5" + "github.com/tencentyun/cos-go-sdk-v5/debug" +) + +func main() { + u, _ := url.Parse("https://alangz-1251668577.cos.ap-guangzhou.myqcloud.com") + b := &cos.BaseURL{ + BucketURL: u, + } + c := cos.NewClient(b, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: os.Getenv("COS_SECRETID"), + SecretKey: os.Getenv("COS_SECRETKEY"), + Transport: &debug.DebugRequestTransport{ + RequestHeader: true, + RequestBody: true, + ResponseHeader: true, + ResponseBody: true, + }, + }, + }) + + opt := &cos.BucketPutLoggingOptions{ + LoggingEnabled: &cos.BucketLoggingEnabled{ + // The bucket must same region. + TargetBucket: "alangzz-1251668577", + }, + } + + _, err := c.Bucket.PutBucketLogging(context.Background(), opt) + if err != nil { + panic(err) + } +} diff --git a/example/bucket/putReplication.go b/example/bucket/putReplication.go new file mode 100644 index 0000000..c0b99a4 --- /dev/null +++ b/example/bucket/putReplication.go @@ -0,0 +1,51 @@ +package main + +import ( + "context" + "net/url" + "os" + + "net/http" + + "github.com/tencentyun/cos-go-sdk-v5" + "github.com/tencentyun/cos-go-sdk-v5/debug" +) + +func main() { + u, _ := url.Parse("https://alanbj-1251668577.cos.ap-beijing.myqcloud.com") + b := &cos.BaseURL{ + BucketURL: u, + } + c := cos.NewClient(b, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: os.Getenv("COS_SECRETID"), + SecretKey: os.Getenv("COS_SECRETKEY"), + Transport: &debug.DebugRequestTransport{ + RequestHeader: true, + RequestBody: true, + ResponseHeader: true, + ResponseBody: true, + }, + }, + }) + + opt := &cos.PutBucketReplicationOptions{ + // qcs::cam::uin/[UIN]:uin/[Subaccount] + Role: "qcs::cam::uin/2779643970:uin/2779643970", + Rule: []cos.BucketReplicationRule{ + { + ID: "1", + // Enabled or Disabled + Status: "Enabled", + Destination: &cos.ReplicationDestination{ + // qcs::cos:[Region]::[Bucketname-Appid] + Bucket: "qcs::cos:ap-guangzhou::alangz-1251668577", + }, + }, + }, + } + _, err := c.Bucket.PutBucketReplication(context.Background(), opt) + if err != nil { + panic(err) + } +} diff --git a/example/bucket/putVersioning.go b/example/bucket/putVersioning.go new file mode 100644 index 0000000..5b35a21 --- /dev/null +++ b/example/bucket/putVersioning.go @@ -0,0 +1,41 @@ +package main + +import ( + "context" + "net/url" + "os" + + "net/http" + + "github.com/tencentyun/cos-go-sdk-v5" + "github.com/tencentyun/cos-go-sdk-v5/debug" +) + +func main() { + u, _ := url.Parse("https://alanbj-1251668577.cos.ap-beijing.myqcloud.com") + b := &cos.BaseURL{ + BucketURL: u, + } + c := cos.NewClient(b, &http.Client{ + Transport: &cos.AuthorizationTransport{ + SecretID: os.Getenv("COS_SECRETID"), + SecretKey: os.Getenv("COS_SECRETKEY"), + Transport: &debug.DebugRequestTransport{ + RequestHeader: true, + RequestBody: true, + ResponseHeader: true, + ResponseBody: true, + }, + }, + }) + + opt := &cos.BucketPutVersionOptions{ + // Enabled or Suspended, the versioning once opened can not close. + Status: "Enabled", + } + + _, err := c.Bucket.PutVersioning(context.Background(), opt) + if err != nil { + panic(err) + } +} From c817b918f9cefba97b4d47b5b35b1ef1bae05bdf Mon Sep 17 00:00:00 2001 From: toranger Date: Thu, 9 May 2019 10:24:52 +0800 Subject: [PATCH 2/4] Add put md5 header --- object.go | 1 + 1 file changed, 1 insertion(+) diff --git a/object.go b/object.go index c91b6e6..452dd65 100644 --- a/object.go +++ b/object.go @@ -123,6 +123,7 @@ type ObjectPutHeaderOptions struct { ContentDisposition string `header:"Content-Disposition,omitempty" url:"-"` ContentEncoding string `header:"Content-Encoding,omitempty" url:"-"` ContentType string `header:"Content-Type,omitempty" url:"-"` + ContentMD5 string `header:"Content-MD5,omitempty" url:"-"` ContentLength int `header:"Content-Length,omitempty" url:"-"` Expect string `header:"Expect,omitempty" url:"-"` Expires string `header:"Expires,omitempty" url:"-"` From 14be0a826e4cd95d0c4614d76010fe47357c7bc7 Mon Sep 17 00:00:00 2001 From: toranger Date: Thu, 9 May 2019 10:31:03 +0800 Subject: [PATCH 3/4] annotation the logging and inventory function --- bucket_inventory.go | 10 ++++++---- bucket_logging.go | 6 ++++-- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/bucket_inventory.go b/bucket_inventory.go index 65b58ed..17ed781 100644 --- a/bucket_inventory.go +++ b/bucket_inventory.go @@ -7,6 +7,8 @@ import ( "net/http" ) +// Notice bucket_inventory only for test. can not use + // BucketGetInventoryResult same struct to options type BucketGetInventoryResult BucketPutInventoryOptions @@ -72,7 +74,7 @@ type ListBucketInventoryConfigResult struct { } // PutBucketInventory https://cloud.tencent.com/document/product/436/33707 -func (s *BucketService) PutBucketInventory(ctx context.Context, id string, opt *BucketPutInventoryOptions) (*Response, error) { +func (s *BucketService) PutBucketInventoryTest(ctx context.Context, id string, opt *BucketPutInventoryOptions) (*Response, error) { u := fmt.Sprintf("/?inventory&id=%s", id) sendOpt := sendOptions{ baseURL: s.client.BaseURL.BucketURL, @@ -86,7 +88,7 @@ func (s *BucketService) PutBucketInventory(ctx context.Context, id string, opt * } // GetBucketInventory https://cloud.tencent.com/document/product/436/33705 -func (s *BucketService) GetBucketInventory(ctx context.Context, id string) (*BucketGetInventoryResult, *Response, error) { +func (s *BucketService) GetBucketInventoryTest(ctx context.Context, id string) (*BucketGetInventoryResult, *Response, error) { u := fmt.Sprintf("/?inventory&id=%s", id) var res BucketGetInventoryResult sendOpt := sendOptions{ @@ -100,7 +102,7 @@ func (s *BucketService) GetBucketInventory(ctx context.Context, id string) (*Buc } // DeleteBucketInventory https://cloud.tencent.com/document/product/436/33704 -func (s *BucketService) DeleteBucketInventory(ctx context.Context, id string) (*Response, error) { +func (s *BucketService) DeleteBucketInventoryTest(ctx context.Context, id string) (*Response, error) { u := fmt.Sprintf("/?inventory&id=%s", id) sendOpt := sendOptions{ baseURL: s.client.BaseURL.BucketURL, @@ -112,7 +114,7 @@ func (s *BucketService) DeleteBucketInventory(ctx context.Context, id string) (* } // ListBucketInventoryConfigurations https://cloud.tencent.com/document/product/436/33706 -func (s *BucketService) ListBucketInventoryConfigurations(ctx context.Context, token string) (*ListBucketInventoryConfigResult, *Response, error) { +func (s *BucketService) ListBucketInventoryConfigurationsTest(ctx context.Context, token string) (*ListBucketInventoryConfigResult, *Response, error) { var res ListBucketInventoryConfigResult var u string if token == "" { diff --git a/bucket_logging.go b/bucket_logging.go index 5bb79a2..d4ea513 100644 --- a/bucket_logging.go +++ b/bucket_logging.go @@ -6,6 +6,8 @@ import ( "net/http" ) +// Notice bucket logging function is testing, can not use. + // BucketLoggingEnabled main struct of logging type BucketLoggingEnabled struct { TargetBucket string `xml:"TargetBucket"` @@ -25,7 +27,7 @@ type BucketGetLoggingResult struct { } // PutBucketLogging https://cloud.tencent.com/document/product/436/17054 -func (s *BucketService) PutBucketLogging(ctx context.Context, opt *BucketPutLoggingOptions) (*Response, error) { +func (s *BucketService) PutBucketLoggingTest(ctx context.Context, opt *BucketPutLoggingOptions) (*Response, error) { sendOpt := sendOptions{ baseURL: s.client.BaseURL.BucketURL, uri: "/?logging", @@ -37,7 +39,7 @@ func (s *BucketService) PutBucketLogging(ctx context.Context, opt *BucketPutLogg } // GetBucketLogging https://cloud.tencent.com/document/product/436/17053 -func (s *BucketService) GetBucketLogging(ctx context.Context) (*BucketGetLoggingResult, *Response, error) { +func (s *BucketService) GetBucketLoggingTest(ctx context.Context) (*BucketGetLoggingResult, *Response, error) { var res BucketGetLoggingResult sendOpt := sendOptions{ baseURL: s.client.BaseURL.BucketURL, From 7739e84d42b7a33121b16817f25129050db93db5 Mon Sep 17 00:00:00 2001 From: toranger Date: Thu, 9 May 2019 10:35:29 +0800 Subject: [PATCH 4/4] rm inventory and logging example --- example/bucket/deleteInventory.go | 37 --------------------- example/bucket/getInventory.go | 38 ---------------------- example/bucket/getLogging.go | 41 ----------------------- example/bucket/listInventoryConfig.go | 40 ----------------------- example/bucket/putInventory.go | 61 ----------------------------------- example/bucket/putLogging.go | 43 ------------------------ 6 files changed, 260 deletions(-) delete mode 100644 example/bucket/deleteInventory.go delete mode 100644 example/bucket/getInventory.go delete mode 100644 example/bucket/getLogging.go delete mode 100644 example/bucket/listInventoryConfig.go delete mode 100644 example/bucket/putInventory.go delete mode 100644 example/bucket/putLogging.go diff --git a/example/bucket/deleteInventory.go b/example/bucket/deleteInventory.go deleted file mode 100644 index 442d034..0000000 --- a/example/bucket/deleteInventory.go +++ /dev/null @@ -1,37 +0,0 @@ -package main - -import ( - "context" - "net/url" - "os" - - "net/http" - - "github.com/tencentyun/cos-go-sdk-v5" - "github.com/tencentyun/cos-go-sdk-v5/debug" -) - -func main() { - u, _ := url.Parse("https://alangz-1251668577.cos.ap-guangzhou.myqcloud.com") - b := &cos.BaseURL{ - BucketURL: u, - } - c := cos.NewClient(b, &http.Client{ - Transport: &cos.AuthorizationTransport{ - SecretID: os.Getenv("COS_SECRETID"), - SecretKey: os.Getenv("COS_SECRETKEY"), - Transport: &debug.DebugRequestTransport{ - RequestHeader: true, - RequestBody: true, - ResponseHeader: true, - ResponseBody: true, - }, - }, - }) - - id := "test1" - _, err := c.Bucket.DeleteBucketInventory(context.Background(), id) - if err != nil { - panic(err) - } -} diff --git a/example/bucket/getInventory.go b/example/bucket/getInventory.go deleted file mode 100644 index fa5768c..0000000 --- a/example/bucket/getInventory.go +++ /dev/null @@ -1,38 +0,0 @@ -package main - -import ( - "context" - "net/url" - "os" - - "net/http" - - "github.com/tencentyun/cos-go-sdk-v5" - "github.com/tencentyun/cos-go-sdk-v5/debug" -) - -func main() { - u, _ := url.Parse("https://alangz-1251668577.cos.ap-guangzhou.myqcloud.com") - // u, _ := url.Parse("https://test-1253846586.cos.ap-guangzhou.myqcloud.com") - b := &cos.BaseURL{ - BucketURL: u, - } - c := cos.NewClient(b, &http.Client{ - Transport: &cos.AuthorizationTransport{ - SecretID: os.Getenv("COS_SECRETID"), - SecretKey: os.Getenv("COS_SECRETKEY"), - Transport: &debug.DebugRequestTransport{ - RequestHeader: true, - RequestBody: true, - ResponseHeader: true, - ResponseBody: true, - }, - }, - }) - - id := "test1" - _, _, err := c.Bucket.GetBucketInventory(context.Background(), id) - if err != nil { - panic(err) - } -} diff --git a/example/bucket/getLogging.go b/example/bucket/getLogging.go deleted file mode 100644 index 4254321..0000000 --- a/example/bucket/getLogging.go +++ /dev/null @@ -1,41 +0,0 @@ -package main - -import ( - "context" - "fmt" - "net/url" - "os" - - "net/http" - - "github.com/tencentyun/cos-go-sdk-v5" - "github.com/tencentyun/cos-go-sdk-v5/debug" -) - -func main() { - u, _ := url.Parse("https://alangz-1251668577.cos.ap-guangzhou.myqcloud.com") - b := &cos.BaseURL{ - BucketURL: u, - } - c := cos.NewClient(b, &http.Client{ - Transport: &cos.AuthorizationTransport{ - SecretID: os.Getenv("COS_SECRETID"), - SecretKey: os.Getenv("COS_SECRETKEY"), - Transport: &debug.DebugRequestTransport{ - RequestHeader: true, - RequestBody: true, - ResponseHeader: true, - ResponseBody: true, - }, - }, - }) - - v, _, err := c.Bucket.GetBucketLogging(context.Background()) - if err != nil { - panic(err) - } - - if v.LoggingEnabled != nil { - fmt.Printf("target bucket is %s \n", v.LoggingEnabled.TargetBucket) - } -} diff --git a/example/bucket/listInventoryConfig.go b/example/bucket/listInventoryConfig.go deleted file mode 100644 index 136c35f..0000000 --- a/example/bucket/listInventoryConfig.go +++ /dev/null @@ -1,40 +0,0 @@ -package main - -import ( - "context" - "fmt" - "net/url" - "os" - - "net/http" - - "github.com/tencentyun/cos-go-sdk-v5" - "github.com/tencentyun/cos-go-sdk-v5/debug" -) - -func main() { - u, _ := url.Parse("https://alangz-1251668577.cos.ap-guangzhou.myqcloud.com") - b := &cos.BaseURL{ - BucketURL: u, - } - c := cos.NewClient(b, &http.Client{ - Transport: &cos.AuthorizationTransport{ - SecretID: os.Getenv("COS_SECRETID"), - SecretKey: os.Getenv("COS_SECRETKEY"), - Transport: &debug.DebugRequestTransport{ - RequestHeader: true, - RequestBody: true, - ResponseHeader: true, - ResponseBody: true, - }, - }, - }) - - v, _, err := c.Bucket.ListBucketInventoryConfigurations(context.Background(), "") - if err != nil { - panic(err) - } - for _, p := range v.InventoryConfigurations { - fmt.Printf("%s\n", p.Destination.BucketDestination.Bucket) - } -} diff --git a/example/bucket/putInventory.go b/example/bucket/putInventory.go deleted file mode 100644 index 1101a0f..0000000 --- a/example/bucket/putInventory.go +++ /dev/null @@ -1,61 +0,0 @@ -package main - -import ( - "context" - "net/url" - "os" - - "net/http" - - "github.com/tencentyun/cos-go-sdk-v5" - "github.com/tencentyun/cos-go-sdk-v5/debug" -) - -func main() { - u, _ := url.Parse("https://alangz-1251668577.cos.ap-guangzhou.myqcloud.com") - b := &cos.BaseURL{ - BucketURL: u, - } - c := cos.NewClient(b, &http.Client{ - Transport: &cos.AuthorizationTransport{ - SecretID: os.Getenv("COS_SECRETID"), - SecretKey: os.Getenv("COS_SECRETKEY"), - Transport: &debug.DebugRequestTransport{ - RequestHeader: true, - RequestBody: true, - ResponseHeader: true, - ResponseBody: true, - }, - }, - }) - - id := "test1" - opt := &cos.BucketPutInventoryOptions{ - ID: id, - // True or False - IsEnabled: "True", - IncludedObjectVersions: "All", - Filter: &cos.BucketInventoryFilter{ - Prefix: "test", - }, - OptionalFields: &cos.BucketInventoryOptionalFields{ - BucketInventoryFields: []string{ - "Size", "LastModifiedDate", - }, - }, - Schedule: &cos.BucketInventorySchedule{ - // Weekly or Daily - Frequency: "Daily", - }, - Destination: &cos.BucketInventoryDestination{ - BucketDestination: &cos.BucketInventoryDestinationContent{ - Bucket: "qcs::cos:ap-guangzhou::alangz-1251668577", - Format: "CSV", - }, - }, - } - _, err := c.Bucket.PutBucketInventory(context.Background(), id, opt) - if err != nil { - panic(err) - } -} diff --git a/example/bucket/putLogging.go b/example/bucket/putLogging.go deleted file mode 100644 index 5d0167a..0000000 --- a/example/bucket/putLogging.go +++ /dev/null @@ -1,43 +0,0 @@ -package main - -import ( - "context" - "net/url" - "os" - - "net/http" - - "github.com/tencentyun/cos-go-sdk-v5" - "github.com/tencentyun/cos-go-sdk-v5/debug" -) - -func main() { - u, _ := url.Parse("https://alangz-1251668577.cos.ap-guangzhou.myqcloud.com") - b := &cos.BaseURL{ - BucketURL: u, - } - c := cos.NewClient(b, &http.Client{ - Transport: &cos.AuthorizationTransport{ - SecretID: os.Getenv("COS_SECRETID"), - SecretKey: os.Getenv("COS_SECRETKEY"), - Transport: &debug.DebugRequestTransport{ - RequestHeader: true, - RequestBody: true, - ResponseHeader: true, - ResponseBody: true, - }, - }, - }) - - opt := &cos.BucketPutLoggingOptions{ - LoggingEnabled: &cos.BucketLoggingEnabled{ - // The bucket must same region. - TargetBucket: "alangzz-1251668577", - }, - } - - _, err := c.Bucket.PutBucketLogging(context.Background(), opt) - if err != nil { - panic(err) - } -}