Forráskód Böngészése

add HeadBucket, Set/GetBucketStorageCapacity interfaces

mingzai.ym 8 éve
szülő
commit
5a4ea9723d
3 módosított fájl, 134 hozzáadás és 0 törlés
  1. 78 0
      oss/client.go
  2. 46 0
      oss/client_test.go
  3. 10 0
      oss/type.go

+ 78 - 0
oss/client.go

@@ -188,6 +188,25 @@ func (client Client) DeleteBucket(bucketName string) error {
 	return checkRespCode(resp.StatusCode, []int{http.StatusNoContent})
 }
 
+//
+// HeadBucket 查看Bucket元信息
+//
+// bucketName 存储空间名称。
+//
+// http.Header Bucket的meta
+// error 操作无错误时返回nil,非nil为错误信息
+//
+func (client Client) HeadBucket(bucketName string) (http.Header, error) {
+	params := map[string]interface{}{}
+	resp, err := client.do("HEAD", bucketName, params, nil, nil)
+	if err != nil {
+		return nil, err
+	}
+	defer resp.Body.Close()
+
+	return resp.Headers, nil
+}
+
 //
 // GetBucketLocation 查看Bucket所属数据中心位置的信息。
 //
@@ -675,6 +694,45 @@ func (client Client) GetBucketInfo(bucketName string) (GetBucketInfoResult, erro
 	return out, err
 }
 
+//
+// SetBucketStorageCapacity 设置Bucket容量限额
+//
+// bucketName 存储空间名称
+// storageCapacity Bucket限额,以GB为单位
+//
+// error 操作无错误为nil,非nil为错误信息
+//
+func (client Client) SetBucketStorageCapacity(bucketName string, storageCapacity int64) error {
+	qxml := bucketQos{StorageCapacity: storageCapacity}
+
+	params := map[string]interface{}{"qos": nil}
+	resp, err := client.doXml("PUT", bucketName, params, nil, qxml)
+	if err != nil {
+		return err
+	}
+	defer resp.Body.Close()
+
+	return nil
+}
+
+func (client Client) GetBucketStorageCapacity(bucketName string) (int64, error) {
+	var out getBucketStorageCapacityResult
+
+	params := map[string]interface{}{"qos": nil}
+	resp, err := client.do("GET", bucketName, params, nil, nil)
+	if err != nil {
+		return -1, err
+	}
+	defer resp.Body.Close()
+
+	err = xmlUnmarshal(resp.Body, &out)
+	if err != nil {
+		return -1, err
+	}
+
+	return out.StorageCapacity, nil
+}
+
 //
 // UseCname 设置是否使用CNAME,默认不使用。
 //
@@ -798,3 +856,23 @@ func (client Client) do(method, bucketName string, params map[string]interface{}
 	return client.Conn.Do(method, bucketName, "", params,
 		headers, data, 0, nil)
 }
+
+func (client Client) doXml(method, bucketName string, params map[string]interface{},
+	headers map[string]string, xmlInput interface{}) (*Response, error) {
+	bodyString, err := xml.Marshal(xmlInput)
+	if err != nil {
+		return nil, err
+	}
+
+	buffer := new(bytes.Buffer)
+	buffer.Write(bodyString)
+
+	if headers == nil {
+		headers = map[string]string{}
+	}
+
+	contentType := http.DetectContentType(buffer.Bytes())
+	headers[HTTPHeaderContentType] = contentType
+
+	return client.do(method, bucketName, params, headers, buffer)
+}

+ 46 - 0
oss/client_test.go

@@ -1503,3 +1503,49 @@ func (s *OssClientSuite) getBucket(buckets []BucketProperties, bucket string) (b
 	}
 	return false, BucketProperties{}
 }
+
+func (s *OssClientSuite) TestHeadBucket(c *C) {
+	var bucketNameTest = bucketNamePrefix + "thb"
+
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	err = client.CreateBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+
+	headers, err := client.HeadBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+
+	location, err := client.GetBucketLocation(bucketNameTest)
+	c.Assert(err, IsNil)
+
+	c.Assert(location, Equals, headers.Get("X-Oss-Bucket-Region"))
+
+	err = client.DeleteBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+}
+
+func (s *OssClientSuite) TestStorageCapacityBucket(c *C) {
+	var bucketNameTest = bucketNamePrefix + "tscb"
+
+	client, err := New(endpoint, accessID, accessKey)
+	c.Assert(err, IsNil)
+
+	err = client.CreateBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+
+	oldCapacity, err := client.GetBucketStorageCapacity(bucketNameTest)
+	c.Assert(err, IsNil)
+	c.Assert(oldCapacity, Equals, int64(-1))
+
+	newCapacity := int64(100)
+	err = client.SetBucketStorageCapacity(bucketNameTest, newCapacity)
+	c.Assert(err, IsNil)
+
+	gotCapacity, err := client.GetBucketStorageCapacity(bucketNameTest)
+	c.Assert(err, IsNil)
+	c.Assert(gotCapacity, Equals, newCapacity)
+
+	err = client.DeleteBucket(bucketNameTest)
+	c.Assert(err, IsNil)
+}

+ 10 - 0
oss/type.go

@@ -448,3 +448,13 @@ type createBucketConfiguration struct {
 	XMLName      xml.Name         `xml:"CreateBucketConfiguration"`
 	StorageClass StorageClassType `xml:"StorageClass,omitempty"`
 }
+
+type bucketQos struct {
+	XMLName         xml.Name `xml:"BucketUserQos"`
+	StorageCapacity int64    `xml:"StorageCapacity"`
+}
+
+type getBucketStorageCapacityResult struct {
+	XMLName         xml.Name `xml:"BucketUserQos"`
+	StorageCapacity int64    `xml:"StorageCapacity"`
+}