Kaynağa Gözat

add bucketQos api

alzhang 6 yıl önce
ebeveyn
işleme
489a956e19
7 değiştirilmiş dosya ile 327 ekleme ve 10 silme
  1. 104 0
      oss/client.go
  2. 131 9
      oss/client_test.go
  3. 1 1
      oss/conn.go
  4. 21 0
      oss/type.go
  5. 1 0
      sample.go
  6. 6 0
      sample/bucket_policy.go
  7. 63 0
      sample/bucket_qosInfo.go

+ 104 - 0
oss/client.go

@@ -1024,6 +1024,110 @@ func (client Client) GetBucketRequestPayment(bucketName string, options ...Optio
 	return out, err
 }
 
+// GetUserQoSInfo API operation for Object Storage Service.
+//
+// Get user qos.
+//
+// UserQoSConfiguration the User Qos and range Information.
+//
+// error    it's nil if no error, otherwise it's an error object.
+//
+func (client Client) GetUserQoSInfo(options ...Option) (UserQoSConfiguration, error) {
+	var out UserQoSConfiguration
+	params := map[string]interface{}{}
+	params["qosInfo"] = nil
+
+	resp, err := client.do("GET", "", params, nil, nil, options...)
+	if err != nil {
+		return out, err
+	}
+	defer resp.Body.Close()
+
+	err = xmlUnmarshal(resp.Body, &out)
+	return out, err
+}
+
+// SetBucketQoSInfo API operation for Object Storage Service.
+//
+// Set Bucket Qos information.
+//
+// bucketName tht bucket name.
+//
+// qosConf the qos configuration.
+//
+// error    it's nil if no error, otherwise it's an error object.
+//
+func (client Client) SetBucketQoSInfo(bucketName string, qosConf BucketQoSConfiguration, options ...Option) error {
+	params := map[string]interface{}{}
+	params["qosInfo"] = nil
+
+	var bs []byte
+	bs, err := xml.Marshal(qosConf)
+	if err != nil {
+		return err
+	}
+	buffer := new(bytes.Buffer)
+	buffer.Write(bs)
+
+	contentTpye := http.DetectContentType(buffer.Bytes())
+	headers := map[string]string{}
+	headers[HTTPHeaderContentType] = contentTpye
+
+	resp, err := client.do("PUT", bucketName, params, headers, buffer, options...)
+	if err != nil {
+		return err
+	}
+
+	defer resp.Body.Close()
+	return checkRespCode(resp.StatusCode, []int{http.StatusOK})
+}
+
+// GetBucketQosInfo API operation for Object Storage Service.
+//
+// Get Bucket Qos information.
+//
+// bucketName tht bucket name.
+//
+// BucketQoSConfiguration the  return qos configuration.
+//
+// error    it's nil if no error, otherwise it's an error object.
+//
+func (client Client) GetBucketQosInfo(bucketName string, options ...Option) (BucketQoSConfiguration, error) {
+	var out BucketQoSConfiguration
+	params := map[string]interface{}{}
+	params["qosInfo"] = 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
+}
+
+// DeleteBucketQosInfo API operation for Object Storage Service.
+//
+// Delete Bucket QoS information.
+//
+// bucketName tht bucket name.
+//
+// error    it's nil if no error, otherwise it's an error object.
+//
+func (client Client) DeleteBucketQosInfo(bucketName string, options ...Option) error {
+	params := map[string]interface{}{}
+	params["qosInfo"] = 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})
+}
+
 // 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

+ 131 - 9
oss/client_test.go

@@ -5,11 +5,13 @@
 package oss
 
 import (
+	"encoding/json"
 	"io/ioutil"
 	"log"
 	"math/rand"
 	"net/http"
 	"os"
+	"reflect"
 	"runtime"
 	"strconv"
 	"strings"
@@ -45,9 +47,9 @@ var (
 	stsARN       = os.Getenv("OSS_TEST_STS_ARN")
 
 	// Credential
-	credentialAccessID   = os.Getenv("OSS_CREDENTIAL_KEY_ID")
-	credentialAccessKey  = os.Getenv("OSS_CREDENTIAL_KEY_SECRET")
-	credentialUID        = os.Getenv("OSS_CREDENTIAL_UID")
+	credentialAccessID  = os.Getenv("OSS_CREDENTIAL_KEY_ID")
+	credentialAccessKey = os.Getenv("OSS_CREDENTIAL_KEY_SECRET")
+	credentialUID       = os.Getenv("OSS_CREDENTIAL_UID")
 )
 
 var (
@@ -2448,14 +2450,14 @@ func (s *OssBucketSuite) TestGetBucketVersioning(c *C) {
 	forceDeleteBucket(client, bucketName, c)
 }
 
-func (s *OssClientSuite) TestBucketPolicy(c *C){
+func (s *OssClientSuite) TestBucketPolicy(c *C) {
 	client, err := New(endpoint, accessID, accessKey)
 	c.Assert(err, IsNil)
 
 	bucketName := bucketNamePrefix + randLowStr(5)
 	err = client.CreateBucket(bucketName)
 	c.Assert(err, IsNil)
-	
+
 	var responseHeader http.Header
 	ret, err := client.GetBucketPolicy(bucketName, GetResponseHeader(&responseHeader))
 	c.Assert(err, NotNil)
@@ -2529,7 +2531,7 @@ func (s *OssClientSuite) TestBucketPolicyNegative(c *C) {
 	}`
 	err = client.SetBucketPolicy(bucketName, errPolicy, GetResponseHeader(&responseHeader))
 	c.Assert(err, NotNil)
-	testLogger.Println("err:",err)
+	testLogger.Println("err:", err)
 	requestId = GetRequestId(responseHeader)
 	c.Assert(len(requestId) > 0, Equals, true)
 
@@ -2538,7 +2540,7 @@ func (s *OssClientSuite) TestBucketPolicyNegative(c *C) {
 
 	bucketNameEmpty := bucketNamePrefix + randLowStr(5)
 	client.DeleteBucket(bucketNameEmpty)
-	
+
 	err = client.DeleteBucketPolicy(bucketNameEmpty, GetResponseHeader(&responseHeader))
 	c.Assert(err, NotNil)
 	requestId = GetRequestId(responseHeader)
@@ -2556,7 +2558,7 @@ func (s *OssClientSuite) TestSetBucketRequestPayment(c *C) {
 	c.Assert(err, IsNil)
 
 	reqPayConf := RequestPaymentConfiguration{
-		Payer:"Requester",
+		Payer: "Requester",
 	}
 	err = client.SetBucketRequestPayment(bucketName, reqPayConf)
 	c.Assert(err, IsNil)
@@ -2578,7 +2580,7 @@ func (s *OssClientSuite) TestSetBucketRequestPaymentNegative(c *C) {
 	c.Assert(err, IsNil)
 
 	reqPayConf := RequestPaymentConfiguration{
-		Payer:"Requesterttttt",	// this is a error configuration
+		Payer: "Requesterttttt", // this is a error configuration
 	}
 	err = client.SetBucketRequestPayment(bucketName, reqPayConf)
 	c.Assert(err, NotNil)
@@ -2590,3 +2592,123 @@ func (s *OssClientSuite) TestSetBucketRequestPaymentNegative(c *C) {
 	client.DeleteBucket(bucketName)
 	c.Assert(err, IsNil)
 }
+
+func (s *OssClientSuite) TestBucketQos(c *C) {
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	ret, err := client.GetUserQoSInfo()
+	c.Assert(err, IsNil)
+	testLogger.Println("QosInfo:", ret)
+
+	bucketName := bucketNamePrefix + randLowStr(5)
+	_ = client.DeleteBucket(bucketName)
+
+	err = client.CreateBucket(bucketName)
+	c.Assert(err, IsNil)
+
+	_, err = client.GetBucketQosInfo(bucketName)
+	c.Assert(err, NotNil)
+
+	// case 1 set BucketQoSConfiguration every member
+	five := 5
+	four := 4
+	three := 3
+	qosConf := BucketQoSConfiguration{
+		TotalUploadBandwidth:      &five,
+		IntranetUploadBandwidth:   &four,
+		ExtranetUploadBandwidth:   &four,
+		TotalDownloadBandwidth:    &four,
+		IntranetDownloadBandwidth: &four,
+		ExtranetDownloadBandwidth: &four,
+		TotalQPS:                  &five,
+		IntranetQPS:               &three,
+		ExtranetQPS:               &three,
+	}
+	var responseHeader http.Header
+	err = client.SetBucketQoSInfo(bucketName, qosConf, GetResponseHeader(&responseHeader))
+	c.Assert(err, IsNil)
+	requestId := GetRequestId(responseHeader)
+	c.Assert(len(requestId) > 0, Equals, true)
+
+	// wait a moment for configuration effect
+	time.Sleep(time.Second)
+
+	retQos, err := client.GetBucketQosInfo(bucketName)
+	c.Assert(err, IsNil)
+
+	// set qosConf default value
+	qosConf.XMLName.Local = "QoSConfiguration"
+	c.Assert(struct2string(retQos, c), Equals, struct2string(qosConf, c))
+
+	// case 2 set BucketQoSConfiguration not every member
+	qosConfNo := BucketQoSConfiguration{
+		TotalUploadBandwidth:      &five,
+		IntranetUploadBandwidth:   &four,
+		ExtranetUploadBandwidth:   &four,
+		TotalDownloadBandwidth:    &four,
+		IntranetDownloadBandwidth: &four,
+		ExtranetDownloadBandwidth: &four,
+		TotalQPS:                  &five,
+	}
+	err = client.SetBucketQoSInfo(bucketName, qosConfNo)
+	c.Assert(err, IsNil)
+
+	// wait a moment for configuration effect
+	time.Sleep(time.Second)
+
+	retQos, err = client.GetBucketQosInfo(bucketName)
+	c.Assert(err, IsNil)
+
+	// set qosConfNo default value
+	qosConfNo.XMLName.Local = "QoSConfiguration"
+	defNum := -1
+	qosConfNo.IntranetQPS = &defNum
+	qosConfNo.ExtranetQPS = &defNum
+	c.Assert(struct2string(retQos, c), Equals, struct2string(qosConfNo, c))
+
+	err = client.DeleteBucketQosInfo(bucketName)
+	c.Assert(err, IsNil)
+
+	// wait a moment for configuration effect
+	time.Sleep(time.Second)
+
+	_, err = client.GetBucketQosInfo(bucketName)
+	c.Assert(err, NotNil)
+
+	// this is a error qos configuration
+	to := *ret.TotalUploadBandwidth + 2
+	qosErrConf := BucketQoSConfiguration{
+		TotalUploadBandwidth:      &to, // this exceed user TotalUploadBandwidth
+		IntranetUploadBandwidth:   &four,
+		ExtranetUploadBandwidth:   &four,
+		TotalDownloadBandwidth:    &four,
+		IntranetDownloadBandwidth: &four,
+		ExtranetDownloadBandwidth: &four,
+		TotalQPS:                  &three,
+		IntranetQPS:               &three,
+		ExtranetQPS:               &three,
+	}
+	err = client.SetBucketQoSInfo(bucketName, qosErrConf)
+	c.Assert(err, NotNil)
+
+	err = client.DeleteBucketQosInfo(bucketName)
+	c.Assert(err, IsNil)
+
+	err = client.DeleteBucket(bucketName)
+	c.Assert(err, IsNil)
+}
+
+// struct to string
+func struct2string(obj interface{}, c *C) string {
+	t := reflect.TypeOf(obj)
+	v := reflect.ValueOf(obj)
+
+	var data = make(map[string]interface{})
+	for i := 0; i < t.NumField(); i++ {
+		data[t.Field(i).Name] = v.Field(i).Interface()
+	}
+	str, err := json.Marshal(data)
+	c.Assert(err, IsNil)
+	return string(str)
+}

+ 1 - 1
oss/conn.go

@@ -41,7 +41,7 @@ var signKeyList = []string{"acl", "uploads", "location", "cors",
 	"response-cache-control", "response-content-disposition",
 	"response-content-encoding", "udf", "udfName", "udfImage",
 	"udfId", "udfImageDesc", "udfApplication", "comp",
-	"udfApplicationLog", "restore", "callback", "callback-var",
+	"udfApplicationLog", "restore", "callback", "callback-var", "qosInfo",
 	"policy", "stat", "encryption", "versions", "versioning", "versionId", "requestPayment"}
 
 // init initializes Conn

+ 21 - 0
oss/type.go

@@ -837,3 +837,24 @@ type RequestPaymentConfiguration struct {
 	XMLName xml.Name `xml:"RequestPaymentConfiguration"`
 	Payer   string   `xml:"Payer,omitempty"`
 }
+
+// BucketQoSConfiguration define QoS configuration
+type BucketQoSConfiguration struct {
+	XMLName                   xml.Name `xml:"QoSConfiguration"`	
+	TotalUploadBandwidth      *int      `xml:"TotalUploadBandwidth"`      // Total upload bandwidth
+	IntranetUploadBandwidth   *int      `xml:"IntranetUploadBandwidth"`   // Intranet upload bandwidth
+	ExtranetUploadBandwidth   *int      `xml:"ExtranetUploadBandwidth"`   // Extranet upload bandwidth
+	TotalDownloadBandwidth    *int      `xml:"TotalDownloadBandwidth"`    // Total download bandwidth
+	IntranetDownloadBandwidth *int      `xml:"IntranetDownloadBandwidth"` // Intranet download bandwidth
+	ExtranetDownloadBandwidth *int      `xml:"ExtranetDownloadBandwidth"` // Extranet download bandwidth
+	TotalQPS                  *int      `xml:"TotalQps"`                  // Total Qps
+	IntranetQPS               *int      `xml:"IntranetQps"`               // Intranet Qps
+	ExtranetQPS               *int      `xml:"ExtranetQps"`               // Extranet Qps
+}
+
+// UserQoSConfiguration define QoS and Range configuration
+type UserQoSConfiguration struct {
+	XMLName xml.Name `xml:"QoSConfiguration"`
+	Region  string   `xml:"Region,omitempty"` // Effective area of Qos configuration
+	BucketQoSConfiguration
+}

+ 1 - 0
sample.go

@@ -23,6 +23,7 @@ var sampleMap = map[string]interface{}{
 	"BucketCORSSample":            sample.BucketCORSSample,
 	"BucketPolicySample":	       sample.BucketPolicySample,
 	"BucketrRequestPaymentSample": sample.BucketrRequestPaymentSample,
+	"BucketQoSInfoSample":	       sample.BucketQoSInfoSample,
 	"ObjectACLSample":             sample.ObjectACLSample,
 	"ObjectMetaSample":            sample.ObjectMetaSample,
 	"ListObjectsSample":           sample.ListObjectsSample,

+ 6 - 0
sample/bucket_policy.go

@@ -57,5 +57,11 @@ func BucketPolicySample() {
 		HandleError(err)
 	}
 
+	// Delete bucket
+	err = client.DeleteBucket(bucketName)
+	if err != nil {
+		HandleError(err)
+	}
+
 	fmt.Println("BucketPolicySample completed")
 }

+ 63 - 0
sample/bucket_qosInfo.go

@@ -0,0 +1,63 @@
+package sample
+
+import (
+	"fmt"
+
+	"github.com/aliyun/aliyun-oss-go-sdk/oss"
+)
+
+// BucketQoSInfoSample shows how to set, get and delete the bucket QoS configuration
+func BucketQoSInfoSample() {
+	// New client
+	client, err := oss.New(endpoint, accessID, accessKey)
+	if err != nil {
+		HandleError(err)
+	}
+
+	// Create the bucket with default parameters
+	err = client.CreateBucket(bucketName)
+	if err != nil {
+		HandleError(err)
+	}
+	// Initial QoS Configuration
+	five := 5; four := 4; three := 3
+	qosConf := oss.BucketQoSConfiguration{
+		TotalUploadBandwidth:      &five,
+		IntranetUploadBandwidth:   &four,
+		ExtranetUploadBandwidth:   &four,
+		TotalDownloadBandwidth:    &four,
+		IntranetDownloadBandwidth: &four,
+		ExtranetDownloadBandwidth: &four,
+		TotalQPS:                  &five,
+		IntranetQPS:               &three,
+		ExtranetQPS:               &three,
+	}
+
+	// Set Qos Info
+	err = client.SetBucketQoSInfo(bucketName, qosConf)
+	if err != nil {
+		HandleError(err)
+	}
+
+	// Get Qos Info
+	ret, err := client.GetBucketQosInfo(bucketName)
+	if err != nil {
+		HandleError(err)
+	}
+	fmt.Printf("Bucket QoSInfo\n  TotalUploadBandwidth: %d\n  IntranetUploadBandwidth: %d\n  ExtranetUploadBandwidth: %d\n",
+	 	*ret.TotalUploadBandwidth, *ret.IntranetUploadBandwidth, *ret.ExtranetUploadBandwidth)
+
+	// Delete QosInfo
+	err = client.DeleteBucketQosInfo(bucketName)
+	if err != nil {
+		HandleError(err)
+	}
+
+	// Delete bucket
+	err = client.DeleteBucket(bucketName)
+	if err != nil {
+		HandleError(err)
+	}
+
+	fmt.Println("BucketPolicySample completed")
+}