Ver código fonte

add worm api

taowei.wtw 5 anos atrás
pai
commit
c2079296c8
6 arquivos alterados com 341 adições e 47 exclusões
  1. 170 44
      oss/client.go
  2. 146 0
      oss/client_test.go
  3. 2 1
      oss/conn.go
  4. 1 1
      oss/const.go
  5. 21 0
      oss/type.go
  6. 1 1
      oss/type_test.go

+ 170 - 44
oss/client.go

@@ -1113,7 +1113,7 @@ func (client Client) GetUserQoSInfo(options ...Option) (UserQoSConfiguration, er
 //
 // Set Bucket Qos information.
 //
-// bucketName tht bucket name.
+// bucketName the bucket name.
 //
 // qosConf the qos configuration.
 //
@@ -1148,7 +1148,7 @@ func (client Client) SetBucketQoSInfo(bucketName string, qosConf BucketQoSConfig
 //
 // Get Bucket Qos information.
 //
-// bucketName tht bucket name.
+// bucketName the bucket name.
 //
 // BucketQoSConfiguration the  return qos configuration.
 //
@@ -1173,7 +1173,7 @@ func (client Client) GetBucketQosInfo(bucketName string, options ...Option) (Buc
 //
 // Delete Bucket QoS information.
 //
-// bucketName tht bucket name.
+// bucketName the bucket name.
 //
 // error    it's nil if no error, otherwise it's an error object.
 //
@@ -1190,47 +1190,6 @@ func (client Client) DeleteBucketQosInfo(bucketName string, options ...Option) e
 	return CheckRespCode(resp.StatusCode, []int{http.StatusNoContent})
 }
 
-// LimitUploadSpeed set upload bandwidth limit speed,default is 0,unlimited
-// upSpeed KB/s, 0 is unlimited,default is 0
-// error it's nil if success, otherwise failure
-func (client Client) LimitUploadSpeed(upSpeed int) error {
-	if client.Config == nil {
-		return fmt.Errorf("client config is nil")
-	}
-	return client.Config.LimitUploadSpeed(upSpeed)
-}
-
-// UseCname sets the flag of using CName. By default it's false.
-//
-// isUseCname    true: the endpoint has the CName, false: the endpoint does not have cname. Default is false.
-//
-func UseCname(isUseCname bool) ClientOption {
-	return func(client *Client) {
-		client.Config.IsCname = isUseCname
-		client.Conn.url.Init(client.Config.Endpoint, client.Config.IsCname, client.Config.IsUseProxy)
-	}
-}
-
-// Timeout sets the HTTP timeout in seconds.
-//
-// connectTimeoutSec    HTTP timeout in seconds. Default is 10 seconds. 0 means infinite (not recommended)
-// readWriteTimeout    HTTP read or write's timeout in seconds. Default is 20 seconds. 0 means infinite.
-//
-func Timeout(connectTimeoutSec, readWriteTimeout int64) ClientOption {
-	return func(client *Client) {
-		client.Config.HTTPTimeout.ConnectTimeout =
-			time.Second * time.Duration(connectTimeoutSec)
-		client.Config.HTTPTimeout.ReadWriteTimeout =
-			time.Second * time.Duration(readWriteTimeout)
-		client.Config.HTTPTimeout.HeaderTimeout =
-			time.Second * time.Duration(readWriteTimeout)
-		client.Config.HTTPTimeout.IdleConnTimeout =
-			time.Second * time.Duration(readWriteTimeout)
-		client.Config.HTTPTimeout.LongTimeout =
-			time.Second * time.Duration(readWriteTimeout*10)
-	}
-}
-
 // SetBucketInventory API operation for Object Storage Service
 //
 // Set the Bucket inventory.
@@ -1415,6 +1374,173 @@ func (client Client) GetBucketAsyncTask(bucketName string, taskID string, option
 	return out, err
 }
 
+// InitiateBucketWorm creates bucket worm Configuration
+// bucketName the bucket name.
+// retentionDays the retention period in days
+// error    it's nil if no error, otherwise it's an error object.
+//
+func (client Client) InitiateBucketWorm(bucketName string, retentionDays int, options ...Option) (string, error) {
+	var initiateWormConf InitiateWormConfiguration
+	initiateWormConf.RetentionPeriodInDays = retentionDays
+
+	var respHeader http.Header
+	isOptSet, _, _ := IsOptionSet(options, responseHeader)
+	if !isOptSet {
+		options = append(options, GetResponseHeader(&respHeader))
+	}
+
+	bs, err := xml.Marshal(initiateWormConf)
+	if err != nil {
+		return "", err
+	}
+	buffer := new(bytes.Buffer)
+	buffer.Write(bs)
+
+	contentType := http.DetectContentType(buffer.Bytes())
+	headers := make(map[string]string)
+	headers[HTTPHeaderContentType] = contentType
+
+	params := map[string]interface{}{}
+	params["worm"] = nil
+
+	resp, err := client.do("POST", bucketName, params, headers, buffer, options...)
+	if err != nil {
+		return "", err
+	}
+	defer resp.Body.Close()
+
+	respOpt, _ := FindOption(options, responseHeader, nil)
+	wormID := ""
+	err = CheckRespCode(resp.StatusCode, []int{http.StatusOK})
+	if err == nil && respOpt != nil {
+		wormID = (respOpt.(*http.Header)).Get("x-oss-worm-id")
+	}
+	return wormID, err
+}
+
+// AbortBucketWorm delete bucket worm Configuration
+// bucketName the bucket name.
+// error    it's nil if no error, otherwise it's an error object.
+//
+func (client Client) AbortBucketWorm(bucketName string, options ...Option) error {
+	params := map[string]interface{}{}
+	params["worm"] = nil
+	resp, err := client.do("DELETE", bucketName, params, nil, nil, options...)
+	if err != nil {
+		return err
+	}
+	defer resp.Body.Close()
+	return CheckRespCode(resp.StatusCode, []int{http.StatusNoContent})
+}
+
+// CompleteBucketWorm complete bucket worm Configuration
+// bucketName the bucket name.
+// wormID the worm id
+// error    it's nil if no error, otherwise it's an error object.
+//
+func (client Client) CompleteBucketWorm(bucketName string, wormID string, options ...Option) error {
+	params := map[string]interface{}{}
+	params["wormId"] = wormID
+	resp, err := client.do("POST", bucketName, params, nil, nil, options...)
+	if err != nil {
+		return err
+	}
+	defer resp.Body.Close()
+	return CheckRespCode(resp.StatusCode, []int{http.StatusOK})
+}
+
+// ExtendBucketWorm exetend bucket worm Configuration
+// bucketName the bucket name.
+// retentionDays the retention period in days
+// wormID the worm id
+// error    it's nil if no error, otherwise it's an error object.
+//
+func (client Client) ExtendBucketWorm(bucketName string, retentionDays int, wormID string, options ...Option) error {
+	var extendWormConf ExtendWormConfiguration
+	extendWormConf.RetentionPeriodInDays = retentionDays
+
+	bs, err := xml.Marshal(extendWormConf)
+	if err != nil {
+		return err
+	}
+	buffer := new(bytes.Buffer)
+	buffer.Write(bs)
+
+	contentType := http.DetectContentType(buffer.Bytes())
+	headers := make(map[string]string)
+	headers[HTTPHeaderContentType] = contentType
+
+	params := map[string]interface{}{}
+	params["wormId"] = wormID
+	params["wormExtend"] = nil
+
+	resp, err := client.do("POST", bucketName, params, headers, buffer, options...)
+	if err != nil {
+		return err
+	}
+	defer resp.Body.Close()
+	return CheckRespCode(resp.StatusCode, []int{http.StatusOK})
+}
+
+// GetBucketWorm get bucket worm Configuration
+// bucketName the bucket name.
+// error    it's nil if no error, otherwise it's an error object.
+//
+func (client Client) GetBucketWorm(bucketName string, options ...Option) (WormConfiguration, error) {
+	var out WormConfiguration
+	params := map[string]interface{}{}
+	params["worm"] = nil
+
+	resp, err := client.do("GET", bucketName, params, nil, nil, options...)
+	if err != nil {
+		return out, err
+	}
+	defer resp.Body.Close()
+	err = xmlUnmarshal(resp.Body, &out)
+	return out, err
+}
+
+// LimitUploadSpeed set upload bandwidth limit speed,default is 0,unlimited
+// upSpeed KB/s, 0 is unlimited,default is 0
+// error it's nil if success, otherwise failure
+func (client Client) LimitUploadSpeed(upSpeed int) error {
+	if client.Config == nil {
+		return fmt.Errorf("client config is nil")
+	}
+	return client.Config.LimitUploadSpeed(upSpeed)
+}
+
+// UseCname sets the flag of using CName. By default it's false.
+//
+// isUseCname    true: the endpoint has the CName, false: the endpoint does not have cname. Default is false.
+//
+func UseCname(isUseCname bool) ClientOption {
+	return func(client *Client) {
+		client.Config.IsCname = isUseCname
+		client.Conn.url.Init(client.Config.Endpoint, client.Config.IsCname, client.Config.IsUseProxy)
+	}
+}
+
+// Timeout sets the HTTP timeout in seconds.
+//
+// connectTimeoutSec    HTTP timeout in seconds. Default is 10 seconds. 0 means infinite (not recommended)
+// readWriteTimeout    HTTP read or write's timeout in seconds. Default is 20 seconds. 0 means infinite.
+//
+func Timeout(connectTimeoutSec, readWriteTimeout int64) ClientOption {
+	return func(client *Client) {
+		client.Config.HTTPTimeout.ConnectTimeout =
+			time.Second * time.Duration(connectTimeoutSec)
+		client.Config.HTTPTimeout.ReadWriteTimeout =
+			time.Second * time.Duration(readWriteTimeout)
+		client.Config.HTTPTimeout.HeaderTimeout =
+			time.Second * time.Duration(readWriteTimeout)
+		client.Config.HTTPTimeout.IdleConnTimeout =
+			time.Second * time.Duration(readWriteTimeout)
+		client.Config.HTTPTimeout.LongTimeout =
+			time.Second * time.Duration(readWriteTimeout*10)
+	}
+}
+
 // SecurityToken sets the temporary user's SecurityToken.
 //
 // token    STS token

+ 146 - 0
oss/client_test.go

@@ -3640,3 +3640,149 @@ func (s *OssClientSuite) TestClientRedirect(c *C) {
 	c.Assert(string(data), Equals, "You have been redirected here!")
 	resp.Body.Close()
 }
+
+// TestInitiateBucketWormSuccess
+func (s *OssClientSuite) TestInitiateBucketWormSuccess(c *C) {
+	var bucketNameTest = bucketNamePrefix + RandLowStr(6)
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	err = client.CreateBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+
+	// InitiateBucketWorm
+	wormId, err := client.InitiateBucketWorm(bucketNameTest, 10)
+	c.Assert(err, IsNil)
+	c.Assert(len(wormId) > 0, Equals, true)
+
+	// GetBucketWorm
+	wormConfig, err := client.GetBucketWorm(bucketNameTest)
+	c.Assert(err, IsNil)
+	c.Assert(wormConfig.WormId, Equals, wormId)
+	c.Assert(wormConfig.State, Equals, "InProgress")
+	c.Assert(wormConfig.RetentionPeriodInDays, Equals, 10)
+
+	err = client.DeleteBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+}
+
+// TestInitiateBucketWormFailure
+func (s *OssClientSuite) TestInitiateBucketWormFailure(c *C) {
+	var bucketNameTest = bucketNamePrefix + RandLowStr(6)
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	// bucket not exist
+	wormId, err := client.InitiateBucketWorm(bucketNameTest, 10)
+	c.Assert(err, NotNil)
+	c.Assert(len(wormId), Equals, 0)
+}
+
+// TestAbortBucketWorm
+func (s *OssClientSuite) TestAbortBucketWorm(c *C) {
+	var bucketNameTest = bucketNamePrefix + RandLowStr(6)
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	err = client.CreateBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+
+	// InitiateBucketWorm
+	wormId, err := client.InitiateBucketWorm(bucketNameTest, 10)
+	c.Assert(err, IsNil)
+	c.Assert(len(wormId) > 0, Equals, true)
+
+	// GetBucketWorm success
+	wormConfig, err := client.GetBucketWorm(bucketNameTest)
+	c.Assert(err, IsNil)
+	c.Assert(wormConfig.WormId, Equals, wormId)
+	c.Assert(wormConfig.State, Equals, "InProgress")
+	c.Assert(wormConfig.RetentionPeriodInDays, Equals, 10)
+
+	// abort worm
+	err = client.AbortBucketWorm(bucketNameTest)
+	c.Assert(err, IsNil)
+
+	// GetBucketWorm failure
+	_, err = client.GetBucketWorm(bucketNameTest)
+	c.Assert(err, NotNil)
+
+	err = client.DeleteBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+}
+
+// TestCompleteBucketWorm
+func (s *OssClientSuite) TestCompleteBucketWorm(c *C) {
+	var bucketNameTest = bucketNamePrefix + "-worm-" + RandLowStr(6)
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	err = client.CreateBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+
+	// InitiateBucketWorm
+	wormId, err := client.InitiateBucketWorm(bucketNameTest, 1)
+	c.Assert(err, IsNil)
+	c.Assert(len(wormId) > 0, Equals, true)
+
+	// GetBucketWorm
+	wormConfig, err := client.GetBucketWorm(bucketNameTest)
+	c.Assert(err, IsNil)
+	c.Assert(wormConfig.WormId, Equals, wormId)
+	c.Assert(wormConfig.State, Equals, "InProgress")
+	c.Assert(wormConfig.RetentionPeriodInDays, Equals, 1)
+
+	// CompleteBucketWorm
+	err = client.CompleteBucketWorm(bucketNameTest, wormId)
+	c.Assert(err, IsNil)
+
+	// GetBucketWorm again
+	wormConfig, err = client.GetBucketWorm(bucketNameTest)
+	c.Assert(err, IsNil)
+	c.Assert(wormConfig.WormId, Equals, wormId)
+	c.Assert(wormConfig.State, Equals, "Locked")
+	c.Assert(wormConfig.RetentionPeriodInDays, Equals, 1)
+
+	err = client.DeleteBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+}
+
+// TestExtendBucketWorm
+func (s *OssClientSuite) TestExtendBucketWorm(c *C) {
+	var bucketNameTest = bucketNamePrefix + "-worm-" + RandLowStr(6)
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	err = client.CreateBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+
+	// InitiateBucketWorm
+	wormId, err := client.InitiateBucketWorm(bucketNameTest, 1)
+	c.Assert(err, IsNil)
+	c.Assert(len(wormId) > 0, Equals, true)
+
+	// CompleteBucketWorm
+	err = client.CompleteBucketWorm(bucketNameTest, wormId)
+	c.Assert(err, IsNil)
+
+	// GetBucketWorm
+	wormConfig, err := client.GetBucketWorm(bucketNameTest)
+	c.Assert(err, IsNil)
+	c.Assert(wormConfig.WormId, Equals, wormId)
+	c.Assert(wormConfig.State, Equals, "Locked")
+	c.Assert(wormConfig.RetentionPeriodInDays, Equals, 1)
+
+	// CompleteBucketWorm
+	err = client.ExtendBucketWorm(bucketNameTest, 2, wormId)
+	c.Assert(err, IsNil)
+
+	// GetBucketWorm again
+	wormConfig, err = client.GetBucketWorm(bucketNameTest)
+	c.Assert(err, IsNil)
+	c.Assert(wormConfig.WormId, Equals, wormId)
+	c.Assert(wormConfig.State, Equals, "Locked")
+	c.Assert(wormConfig.RetentionPeriodInDays, Equals, 2)
+
+	err = client.DeleteBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+}

+ 2 - 1
oss/conn.go

@@ -44,7 +44,8 @@ var signKeyList = []string{"acl", "uploads", "location", "cors",
 	"udfApplicationLog", "restore", "callback", "callback-var", "qosInfo",
 	"policy", "stat", "encryption", "versions", "versioning", "versionId", "requestPayment",
 	"x-oss-request-payer", "sequential",
-	"inventory", "inventoryId", "continuation-token", "asyncFetch"}
+	"inventory", "inventoryId", "continuation-token", "asyncFetch",
+	"worm", "wormId", "wormExtend"}
 
 // init initializes Conn
 func (conn *Conn) init(config *Config, urlMaker *urlMaker, client *http.Client) error {

+ 1 - 1
oss/const.go

@@ -224,7 +224,7 @@ const (
 
 	NullVersion = "null"
 
-	Version = "v2.1.5" // Go SDK version
+	Version = "v2.1.6" // Go SDK version
 )
 
 // FrameType

+ 21 - 0
oss/type.go

@@ -1224,3 +1224,24 @@ type AsyncTaskInfo struct {
 	StorageClass  string   `xml:"StorageClass,omitempty"`
 	IgnoreSameKey bool     `xml:"IgnoreSameKey"`
 }
+
+// InitiateWormConfiguration define InitiateBucketWorm configuration
+type InitiateWormConfiguration struct {
+	XMLName               xml.Name `xml:"InitiateWormConfiguration"`
+	RetentionPeriodInDays int      `xml:"RetentionPeriodInDays"` // specify retention days
+}
+
+// ExtendWormConfiguration define ExtendWormConfiguration configuration
+type ExtendWormConfiguration struct {
+	XMLName               xml.Name `xml:"ExtendWormConfiguration"`
+	RetentionPeriodInDays int      `xml:"RetentionPeriodInDays"` // specify retention days
+}
+
+// WormConfiguration define WormConfiguration
+type WormConfiguration struct {
+	XMLName               xml.Name `xml:"WormConfiguration"`
+	WormId                string   `xml:"WormId,omitempty"`
+	State                 string   `xml:"State,omitempty"`
+	RetentionPeriodInDays int      `xml:"RetentionPeriodInDays"` // specify retention days
+	CreationDate          string   `xml:"CreationDate,omitempty"`
+}

+ 1 - 1
oss/type_test.go

@@ -221,7 +221,7 @@ func (s *OssTypeSuite) TestValidateLifecleRules(c *C) {
 	}
 	rules = []LifecycleRule{rule}
 	err = verifyLifecycleRules(rules)
-	c.Assert(err, NotNil)
+	c.Assert(err, IsNil)
 
 	transition = LifecycleTransition{
 		CreatedBeforeDate: "2015-11-11T00:00:00.000Z",