Prechádzať zdrojové kódy

support ColdArchive

taowei.wtw 6 rokov pred
rodič
commit
5dc1cf181a
5 zmenil súbory, kde vykonal 100 pridanie a 3 odobranie
  1. 33 0
      oss/bucket.go
  2. 40 0
      oss/bucket_test.go
  3. 2 2
      oss/client_test.go
  4. 18 1
      oss/const.go
  5. 7 0
      oss/type.go

+ 33 - 0
oss/bucket.go

@@ -808,6 +808,39 @@ func (bucket Bucket) RestoreObject(objectKey string, options ...Option) error {
 	return checkRespCode(resp.StatusCode, []int{http.StatusOK, http.StatusAccepted})
 }
 
+// RestoreObjectDetail support more features than RestoreObject
+func (bucket Bucket) RestoreObjectDetail(objectKey string, restoreConfig RestoreConfiguration, options ...Option) error {
+	if restoreConfig.Tier == "" {
+		// Expedited, Standard, Bulk
+		restoreConfig.Tier = string(RestoreStandard)
+	}
+
+	if restoreConfig.Days == 0 {
+		restoreConfig.Days = 1
+	}
+
+	bs, err := xml.Marshal(restoreConfig)
+	if err != nil {
+		return err
+	}
+
+	buffer := new(bytes.Buffer)
+	buffer.Write(bs)
+
+	contentType := http.DetectContentType(buffer.Bytes())
+	options = append(options, ContentType(contentType))
+
+	params, _ := getRawParams(options)
+	params["restore"] = nil
+
+	resp, err := bucket.do("POST", objectKey, params, options, buffer, nil)
+	if err != nil {
+		return err
+	}
+	defer resp.Body.Close()
+	return checkRespCode(resp.StatusCode, []int{http.StatusOK, http.StatusAccepted})
+}
+
 // SignURL signs the URL. Users could access the object directly with this URL without getting the AK.
 //
 // objectKey    the target object to sign.

+ 40 - 0
oss/bucket_test.go

@@ -2232,6 +2232,46 @@ func (s *OssBucketSuite) TestRestoreObject(c *C) {
 	c.Assert(meta.Get("X-Oss-Storage-Class"), Equals, "Archive")
 }
 
+// TestRestoreObjectWithXml
+func (s *OssBucketSuite) TestRestoreObjectWithConfig(c *C) {
+	// create a bucket with default proprety
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	bucketName := bucketNamePrefix + randLowStr(6)
+	err = client.CreateBucket(bucketName, StorageClass(StorageColdArchive))
+	c.Assert(err, IsNil)
+
+	bucket, err := client.Bucket(bucketName)
+	objectName := objectNamePrefix + randStr(8)
+
+	// Put object
+	err = bucket.PutObject(objectName, strings.NewReader("123456789"), ObjectStorageClass(StorageColdArchive))
+	c.Assert(err, IsNil)
+
+	var restoreConfig RestoreConfiguration
+	restoreConfig.Days = 2
+
+	err = bucket.RestoreObjectDetail(objectName, restoreConfig)
+	c.Assert(err, IsNil)
+
+	objectName = objectNamePrefix + randStr(8)
+	err = bucket.PutObject(objectName, strings.NewReader("123456789"), ObjectStorageClass(StorageColdArchive))
+	c.Assert(err, IsNil)
+	restoreConfig.Tier = string(RestoreBulk)
+	err = bucket.RestoreObjectDetail(objectName, restoreConfig)
+	c.Assert(err, IsNil)
+
+	objectName = objectNamePrefix + randStr(8)
+	err = bucket.PutObject(objectName, strings.NewReader("123456789"), ObjectStorageClass(StorageColdArchive))
+	c.Assert(err, IsNil)
+	restoreConfig.Days = 0
+	err = bucket.RestoreObjectDetail(objectName, restoreConfig)
+	c.Assert(err, IsNil)
+
+	forceDeleteBucket(client, bucketName, c)
+}
+
 // TestProcessObject
 func (s *OssBucketSuite) TestProcessObject(c *C) {
 	objectName := objectNamePrefix + randStr(8) + ".jpg"

+ 2 - 2
oss/client_test.go

@@ -297,7 +297,7 @@ func (s *OssClientSuite) TestCreateBucket(c *C) {
 	c.Assert(err, IsNil)
 
 	// Create bucket with configuration and test GetBucketInfo
-	for _, storage := range []StorageClassType{StorageStandard, StorageIA, StorageArchive} {
+	for _, storage := range []StorageClassType{StorageStandard, StorageIA, StorageArchive, StorageColdArchive} {
 		bucketNameTest := bucketNamePrefix + randLowStr(6)
 		err = client.CreateBucket(bucketNameTest, StorageClass(storage), ACL(ACLPublicRead))
 		c.Assert(err, IsNil)
@@ -319,7 +319,7 @@ func (s *OssClientSuite) TestCreateBucket(c *C) {
 	c.Assert(err, NotNil)
 
 	// Create bucket with configuration and test ListBuckets
-	for _, storage := range []StorageClassType{StorageStandard, StorageIA, StorageArchive} {
+	for _, storage := range []StorageClassType{StorageStandard, StorageIA, StorageArchive, StorageColdArchive} {
 		bucketNameTest := bucketNamePrefix + randLowStr(6)
 		err = client.CreateBucket(bucketNameTest, StorageClass(storage))
 		c.Assert(err, IsNil)

+ 18 - 1
oss/const.go

@@ -72,9 +72,12 @@ const (
 
 	// StorageArchive archive
 	StorageArchive StorageClassType = "Archive"
+
+	// StorageColdArchive cold archive
+	StorageColdArchive StorageClassType = "ColdArchive"
 )
 
-// RedundancyType bucket data Redundancy type
+//RedundancyType bucket data Redundancy type
 type DataRedundancyType string
 
 const (
@@ -96,6 +99,20 @@ const (
 	BucketOwner PayerType = "BucketOwner"
 )
 
+//RestoreMode the restore mode for coldArchive object
+type RestoreMode string
+
+const (
+	//RestoreExpedited object will be restored in 1 hour
+	RestoreExpedited RestoreMode = "Expedited"
+
+	//RestoreStandard object will be restored in 2-5 hours
+	RestoreStandard RestoreMode = "Standard"
+
+	//RestoreBulk object will be restored in 5-10 hours
+	RestoreBulk RestoreMode = "Bulk"
+)
+
 // HTTPMethod HTTP request method
 type HTTPMethod string
 

+ 7 - 0
oss/type.go

@@ -1127,3 +1127,10 @@ type ListInventoryConfigurationsResult struct {
 	IsTruncated            *bool                    `xml:"IsTruncated,omitempty"`
 	NextContinuationToken  string                   `xml:"NextContinuationToken,omitempty"`
 }
+
+// RestoreConfiguration for RestoreObject
+type RestoreConfiguration struct {
+	XMLName xml.Name `xml:"RestoreRequest"`
+	Days    int32    `xml:"Days,omitempty"`
+	Tier    string   `xml:"JobParameters>Tier,omitempty"`
+}