diff --git a/oss/client.go b/oss/client.go
index 297d2f3..906bbb8 100644
--- a/oss/client.go
+++ b/oss/client.go
@@ -2492,6 +2492,192 @@ func (client Client) DeleteBucketStyle(bucketName, styleName string, options ...
return CheckRespCode(resp.StatusCode, []int{http.StatusNoContent})
}
+// CreateBucketAccessPoint create access point for bucket
+// bucketName the bucket name.
+// create CreateBucketAccessPoint.
+// CreateBucketAccessPointResult response in struct format.
+// error it's nil if no error, otherwise it's an error object.
+func (client Client) CreateBucketAccessPoint(bucketName string, create CreateBucketAccessPoint, options ...Option) (CreateBucketAccessPointResult, error) {
+ var out CreateBucketAccessPointResult
+ bs, err := xml.Marshal(create)
+ if err != nil {
+ return out, err
+ }
+ body, err := client.CreateBucketAccessPointXml(bucketName, string(bs), options...)
+ if err != nil {
+ return out, err
+ }
+ err = xmlUnmarshal(strings.NewReader(body), &out)
+ return out, err
+}
+
+// CreateBucketAccessPointXml map a custom domain name to a bucket
+// bucketName the bucket name.
+// xmlBody the cname configuration in xml format
+// error it's nil if no error, otherwise it's an error object.
+func (client Client) CreateBucketAccessPointXml(bucketName string, xmlBody string, options ...Option) (string, error) {
+ params := map[string]interface{}{}
+ params["accessPoint"] = nil
+
+ buffer := new(bytes.Buffer)
+ buffer.Write([]byte(xmlBody))
+ contentType := http.DetectContentType(buffer.Bytes())
+ headers := map[string]string{}
+ headers[HTTPHeaderContentType] = contentType
+
+ resp, err := client.do("PUT", bucketName, params, headers, buffer, options...)
+ if err != nil {
+ return "", err
+ }
+ defer resp.Body.Close()
+ body, err := ioutil.ReadAll(resp.Body)
+ out := string(body)
+ return out, err
+}
+
+// GetBucketAccessPoint get access point for bucket
+// bucketName the bucket name.
+// GetBucketAccessPointResult result in struct format.
+// error it's nil if no error, otherwise it's an error object.
+func (client Client) GetBucketAccessPoint(bucketName, apName string, options ...Option) (GetBucketAccessPointResult, error) {
+ var out GetBucketAccessPointResult
+ body, err := client.GetBucketAccessPointXml(bucketName, apName, options...)
+ if err != nil {
+ return out, err
+ }
+ err = xmlUnmarshal(strings.NewReader(body), &out)
+ return out, err
+}
+
+// GetBucketAccessPointXml get bucket's access point
+// bucketName the bucket name.
+// string the access point of bucket in xml format.
+// error it's nil if no error, otherwise it's an error object.
+func (client Client) GetBucketAccessPointXml(bucketName, apName string, options ...Option) (string, error) {
+ params := map[string]interface{}{}
+ params["accessPoint"] = nil
+ headers := map[string]string{}
+ headers[HTTPHeaderOssAccessPointName] = apName
+ resp, err := client.do("GET", bucketName, params, headers, nil, options...)
+ defer resp.Body.Close()
+ if err != nil {
+ return "", err
+ }
+ body, err := ioutil.ReadAll(resp.Body)
+ out := string(body)
+ return out, err
+}
+
+// DeleteBucketAccessPoint delete bucket's access point
+// bucketName the bucket name.
+// apName the access point name.
+// error it's nil if no error, otherwise it's an error object.
+func (client Client) DeleteBucketAccessPoint(bucketName, apName string, options ...Option) error {
+ params := map[string]interface{}{}
+ params["accessPoint"] = nil
+ headers := map[string]string{}
+ headers[HTTPHeaderOssAccessPointName] = apName
+ resp, err := client.do("DELETE", bucketName, params, headers, nil, options...)
+ if err != nil {
+ return err
+ }
+ defer resp.Body.Close()
+ return CheckRespCode(resp.StatusCode, []int{http.StatusNoContent})
+}
+
+// ListBucketAccessPointXml get bucket's access point list
+// bucketName the bucket name.
+// string the access point of bucket in xml format.
+// error it's nil if no error, otherwise it's an error object.
+func (client Client) ListBucketAccessPoint(bucketName string, options ...Option) (ListBucketAccessPointsResult, error) {
+ var out ListBucketAccessPointsResult
+ body, err := client.ListBucketAccessPointXml(bucketName, options...)
+ if err != nil {
+ return out, err
+ }
+ err = xmlUnmarshal(strings.NewReader(body), &out)
+ return out, err
+}
+
+// ListBucketAccessPointXml get bucket's access point list
+// bucketName the bucket name.
+// string the access point of bucket in xml format.
+// error it's nil if no error, otherwise it's an error object.
+func (client Client) ListBucketAccessPointXml(bucketName string, options ...Option) (string, error) {
+ params, err := GetRawParams(options)
+ if err != nil {
+ return "", err
+ }
+ params["accessPoint"] = nil
+ resp, err := client.do("GET", bucketName, params, nil, nil, options...)
+ if err != nil {
+ return "", err
+ }
+ defer resp.Body.Close()
+ body, err := ioutil.ReadAll(resp.Body)
+ out := string(body)
+ return out, err
+}
+
+// PutBucketAccessPointPolicy create access point policy for bucket
+// name the bucket name or the access point alias name.
+// apName the access point name.
+// policy the access point policy.
+// error it's nil if no error, otherwise it's an error object.
+func (client Client) PutAccessPointPolicy(name, apName, policy string, options ...Option) error {
+ params := map[string]interface{}{}
+ params["accessPointPolicy"] = nil
+
+ buffer := new(bytes.Buffer)
+ buffer.Write([]byte(policy))
+ contentType := http.DetectContentType(buffer.Bytes())
+ headers := map[string]string{}
+ headers[HTTPHeaderContentType] = contentType
+ headers[HTTPHeaderOssAccessPointName] = apName
+ resp, err := client.do("PUT", name, params, headers, buffer, options...)
+ if err != nil {
+ return err
+ }
+ defer resp.Body.Close()
+ return CheckRespCode(resp.StatusCode, []int{http.StatusOK})
+}
+
+// GetAccessPointPolicy get bucket's access point policy
+// name the bucket name or the access point alias name.
+// apName the access point name.
+// error it's nil if no error, otherwise it's an error object.
+func (client Client) GetAccessPointPolicy(name, apName string, options ...Option) (string, error) {
+ params := map[string]interface{}{}
+ params["accessPointPolicy"] = nil
+ headers := map[string]string{}
+ headers[HTTPHeaderOssAccessPointName] = apName
+ resp, err := client.do("GET", name, params, headers, nil, options...)
+ defer resp.Body.Close()
+ if err != nil {
+ return "", err
+ }
+ body, err := ioutil.ReadAll(resp.Body)
+ out := string(body)
+ return out, err
+}
+
+// DeleteAccessPointPolicy delete bucket's access point policy
+// name the bucket name or the access point alias name.
+// apName the access point name.
+// error it's nil if no error, otherwise it's an error object.
+func (client Client) DeleteAccessPointPolicy(name, apName string, options ...Option) error {
+ params := map[string]interface{}{}
+ params["accessPointPolicy"] = nil
+ headers := map[string]string{}
+ headers[HTTPHeaderOssAccessPointName] = apName
+ resp, err := client.do("DELETE", name, params, headers, 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
diff --git a/oss/client_test.go b/oss/client_test.go
index 2356264..42abba2 100644
--- a/oss/client_test.go
+++ b/oss/client_test.go
@@ -5505,3 +5505,177 @@ func (s *OssClientSuite) TestBucketStyle(c *C) {
c.Assert(err, IsNil)
}
+
+// TestBucketAccessPoint
+func (s *OssClientSuite) TestBucketAccessPoint(c *C) {
+ if accountID == "" {
+ c.ExpectFailure("account ID is empty!")
+ }
+ var bucketNameTest = bucketNamePrefix + "-acc-" + RandLowStr(6)
+ client, err := New(endpoint, accessID, accessKey)
+ c.Assert(err, IsNil)
+
+ err = client.CreateBucket(bucketNameTest)
+ c.Assert(err, IsNil)
+ time.Sleep(3 * time.Second)
+
+ // Create Access Point
+ apName := "ap1-" + RandLowStr(10)
+ var create CreateBucketAccessPoint
+ create.AccessPointName = apName
+ create.NetworkOrigin = "internet"
+ resp, err := client.CreateBucketAccessPoint(bucketNameTest, create)
+ c.Assert(err, IsNil)
+
+ c.Assert(resp.AccessPointArn != "", Equals, true)
+ c.Assert(strings.Contains(resp.AccessPointArn, "acs:oss:"), Equals, true)
+ c.Assert(resp.Alias != "", Equals, true)
+ c.Assert(strings.Contains(resp.Alias, "ossalias"), Equals, true)
+ time.Sleep(1 * time.Second)
+
+ // get access point
+ _, err = client.GetBucketAccessPoint(bucketNameTest, "not-exist-ap")
+ c.Assert(err, NotNil)
+ c.Assert(err.(ServiceError).StatusCode, Equals, 404)
+ c.Assert(err.(ServiceError).Code, Equals, "NoSuchAccessPoint")
+
+ res, err := client.GetBucketAccessPoint(bucketNameTest, apName)
+ aliasName := res.Alias
+ c.Assert(err, IsNil)
+ c.Assert(res.AccessPointName, Equals, apName)
+ c.Assert(res.Bucket, Equals, bucketNameTest)
+ c.Assert(res.AccountId != "", Equals, true)
+ c.Assert(res.NetworkOrigin, Equals, "internet")
+ c.Assert(res.VpcId, Equals, "")
+ c.Assert(res.AccessPointArn != "", Equals, true)
+ accessPointArn := res.AccessPointArn
+ c.Assert(strings.Contains(res.AccessPointArn, "acs:oss:"), Equals, true)
+ c.Assert(res.CreationDate != "", Equals, true)
+ c.Assert(res.Alias != "", Equals, true)
+ c.Assert(res.Status != "", Equals, true)
+ c.Assert(strings.Contains(res.Endpoints.PublicEndpoint, "oss-accesspoint.aliyuncs.com"), Equals, true)
+ c.Assert(strings.Contains(res.Endpoints.PublicEndpoint, apName), Equals, true)
+
+ c.Assert(strings.Contains(res.Endpoints.InternalEndpoint, "-internal.oss-accesspoint.aliyuncs.com"), Equals, true)
+ c.Assert(strings.Contains(res.Endpoints.InternalEndpoint, apName), Equals, true)
+
+ apName1 := "ap2-" + RandLowStr(10)
+ var create1 CreateBucketAccessPoint
+ create1.AccessPointName = apName1
+ create1.NetworkOrigin = "vpc"
+ vpcId := "vpc-1234567890"
+ create1.VpcId = &vpcId
+ resp1, err := client.CreateBucketAccessPoint(bucketNameTest, create1)
+ c.Assert(err, IsNil)
+
+ c.Assert(resp1.AccessPointArn != "", Equals, true)
+ c.Assert(strings.Contains(resp1.AccessPointArn, "acs:oss:"), Equals, true)
+ c.Assert(resp1.Alias != "", Equals, true)
+ c.Assert(strings.Contains(resp1.Alias, "ossalias"), Equals, true)
+ time.Sleep(1 * time.Second)
+
+ // list access point
+ list, err := client.ListBucketAccessPoint(bucketNameTest)
+ c.Assert(err, IsNil)
+ c.Assert(len(list.AccessPoints), Equals, 2)
+
+ c.Assert(list.AccessPoints[1].AccessPointName, Equals, apName1)
+ c.Assert(list.AccessPoints[1].Bucket, Equals, bucketNameTest)
+ c.Assert(list.AccessPoints[1].Alias != "", Equals, true)
+ c.Assert(list.AccessPoints[1].NetworkOrigin, Equals, "vpc")
+ c.Assert(list.AccessPoints[1].VpcId, Equals, vpcId)
+ c.Assert(list.AccessPoints[1].Status != "", Equals, true)
+
+ // test access point policy
+ policy := `{
+ "Version":"1",
+ "Statement":[
+ {
+ "Action":[
+ "oss:*"
+ ],
+ "Effect": "Allow",
+ "Principal":["` + accountID + `"],
+ "Resource":[
+ "` + accessPointArn + `",
+ "` + accessPointArn + `/object/*"
+ ]
+ }
+ ]
+ }`
+
+ err = client.PutAccessPointPolicy(bucketNameTest, apName, policy)
+ c.Assert(err, IsNil)
+
+ info, err := client.GetAccessPointPolicy(bucketNameTest, apName)
+ c.Assert(err, IsNil)
+ c.Assert(info, Equals, policy)
+
+ // test access point policy by alias
+ policy1 := `{
+ "Version":"1",
+ "Statement":[
+ {
+ "Action":[
+ "oss:*"
+ ],
+ "Effect": "Allow",
+ "Principal":["` + accountID + `"],
+ "Resource":[
+ "` + accessPointArn + `",
+ "` + accessPointArn + `/object/*"
+ ]
+ },
+ {
+ "Action":[
+ "oss:PutObject",
+ "oss:GetObject"
+ ],
+ "Effect":"Deny",
+ "Principal":["123456"],
+ "Resource":[
+ "` + accessPointArn + `",
+ "` + accessPointArn + `/object/*"
+ ]
+ }
+ ]
+ }`
+ err = client.PutAccessPointPolicy(aliasName, apName, policy1)
+ c.Assert(err, IsNil)
+
+ _, err = client.GetAccessPointPolicy(aliasName, apName)
+ c.Assert(err, IsNil)
+ err = client.DeleteAccessPointPolicy(aliasName, apName)
+ c.Assert(err, IsNil)
+
+ err = client.PutAccessPointPolicy(bucketNameTest, apName, policy1)
+ c.Assert(err, IsNil)
+ err = client.DeleteAccessPointPolicy(bucketNameTest, apName)
+ c.Assert(err, IsNil)
+
+ // delete bucket access point
+ ticker := time.Tick(1 * time.Minute) // 每分钟执行一次
+ timeout := time.After(60 * time.Minute) // 60分钟后终止执行
+
+ for {
+ select {
+ case <-ticker:
+ list2, err := client.ListBucketAccessPoint(bucketNameTest)
+ testLogger.Println(list2)
+ c.Assert(err, IsNil)
+ if len(list2.AccessPoints) > 0 {
+ for _, point := range list2.AccessPoints {
+ if point.Status == "enable" {
+ err = client.DeleteBucketAccessPoint(bucketNameTest, point.AccessPointName)
+ c.Assert(err, IsNil)
+ }
+ }
+ } else {
+ return
+ }
+ case <-timeout:
+ return
+ }
+ }
+ ForceDeleteBucket(client, bucketNameTest, c)
+}
diff --git a/oss/conn.go b/oss/conn.go
index 1466150..25dcbb9 100644
--- a/oss/conn.go
+++ b/oss/conn.go
@@ -49,7 +49,7 @@ var signKeyList = []string{"acl", "uploads", "location", "cors",
"x-oss-enable-md5", "x-oss-enable-sha1", "x-oss-enable-sha256",
"x-oss-hash-ctx", "x-oss-md5-ctx", "transferAcceleration",
"regionList", "cloudboxes", "x-oss-ac-source-ip", "x-oss-ac-subnet-mask", "x-oss-ac-vpc-id", "x-oss-ac-forward-allow",
- "metaQuery", "resourceGroup", "rtc",
+ "metaQuery", "resourceGroup", "rtc", "accessPoint", "accessPointPolicy",
}
// init initializes Conn
diff --git a/oss/const.go b/oss/const.go
index 4b6922d..4d8cdd7 100644
--- a/oss/const.go
+++ b/oss/const.go
@@ -209,6 +209,7 @@ const (
HttpHeaderOssNotification = "X-Oss-Notification"
HTTPHeaderOssEc = "X-Oss-Ec"
HTTPHeaderOssErr = "X-Oss-Err"
+ HTTPHeaderOssAccessPointName = "X-Oss-Access-Point-Name"
)
// HTTP Param
diff --git a/oss/type.go b/oss/type.go
index 852d5e3..1118f60 100644
--- a/oss/type.go
+++ b/oss/type.go
@@ -1633,3 +1633,58 @@ type BucketStyleXml struct {
CreateTime string `xml:"CreateTime,omitempty"` // style create time
LastModifyTime string `xml:"LastModifyTime,omitempty"` // style last modify time
}
+
+// CreateBucketAccessPoint define the access point config of the bucket
+type CreateBucketAccessPoint BucketAccessPointConfigXml
+
+// BucketAccessPointConfigXml define the access point config of the bucket
+type BucketAccessPointConfigXml struct {
+ XMLName xml.Name `xml:"CreateAccessPointConfiguration"`
+ AccessPointName string `xml:"AccessPointName"`
+ NetworkOrigin string `xml:"NetworkOrigin"`
+ VpcId *string `xml:"VpcConfiguration>VpcId,omitempty"`
+}
+
+// CreateBucketAccessPointResult define create bucket access point result
+type CreateBucketAccessPointResult struct {
+ XMLName xml.Name `xml:"CreateAccessPointResult"`
+ AccessPointArn string `xml:"AccessPointArn"`
+ Alias string `xml:"Alias"`
+}
+
+// GetBucketAccessPointResult define get bucket access point result
+type GetBucketAccessPointResult struct {
+ XMLName xml.Name `xml:"GetAccessPointResult"`
+ AccessPoint
+}
+
+// AccessPoint define access point info
+type AccessPoint struct {
+ AccessPointName string `xml:"AccessPointName"`
+ Bucket string `xml:"Bucket"`
+ AccountId string `xml:"AccountId"`
+ NetworkOrigin string `xml:"NetworkOrigin"`
+ VpcId string `xml:"VpcConfiguration>VpcId"`
+ AccessPointArn string `xml:"AccessPointArn"`
+ CreationDate string `xml:"CreationDate"`
+ Alias string `xml:"Alias"`
+ Status string `xml:"Status"`
+ Endpoints Endpoints `xml:"Endpoints"`
+}
+
+type Endpoints struct {
+ PublicEndpoint string `xml:"PublicEndpoint"`
+ InternalEndpoint string `xml:"InternalEndpoint"`
+}
+
+// ListBucketAccessPointsResult define list access point result
+type ListBucketAccessPointsResult ListBucketAccessPointsXml
+
+// ListBucketAccessPointsResult define list access point
+type ListBucketAccessPointsXml struct {
+ XMLName xml.Name `xml:"ListAccessPointsResult"`
+ IsTruncated bool `xml:"IsTruncated"`
+ NextContinuationToken string `xml:"NextContinuationToken"`
+ AccountId string `xml:"AccountId"`
+ AccessPoints []AccessPoint `xml:"AccessPoints>AccessPoint"`
+}
diff --git a/oss/type_test.go b/oss/type_test.go
index 15bf644..7d50f7c 100644
--- a/oss/type_test.go
+++ b/oss/type_test.go
@@ -1529,4 +1529,148 @@ func (s *OssTypeSuite) TestGetBucketReplicationProgressResult(c *C) {
c.Assert(repResult.Rule[0].HistoricalObjectReplication, Equals, "enabled")
c.Assert((*repResult.Rule[0].Progress).HistoricalObject, Equals, "0.85")
c.Assert((*repResult.Rule[0].Progress).NewObject, Equals, "2015-09-24T15:28:14.000Z")
-}
\ No newline at end of file
+}
+
+func (s *OssTypeSuite) TestCreateBucketAccessPoint(c *C) {
+ var create CreateBucketAccessPoint
+ create.AccessPointName = "my-access-point"
+ create.NetworkOrigin = "Internet"
+ xmlData, err := xml.Marshal(create)
+ c.Assert(err, IsNil)
+ c.Assert(string(xmlData), Equals, `my-access-pointInternet`)
+
+ var create1 CreateBucketAccessPoint
+ create1.AccessPointName = "my-access-point-2"
+ create1.NetworkOrigin = "vpc"
+ vpcId := "vpc-1234567890"
+ create1.VpcId = &vpcId
+ xmlData1, err := xml.Marshal(create1)
+ c.Assert(err, IsNil)
+ c.Assert(string(xmlData1), Equals, `my-access-point-2vpcvpc-1234567890`)
+}
+
+func (s *OssTypeSuite) TestCreateBucketAccessPointResult(c *C) {
+ xmlData := `
+
+ acs:oss:ap-southeast-2:128364106451****:accesspoint/ap-01
+ ap-01-45ee7945007a2f0bcb595f63e2215c****-ossalias
+`
+ var result CreateBucketAccessPointResult
+ err := xmlUnmarshal(strings.NewReader(xmlData), &result)
+ c.Assert(err, IsNil)
+ c.Assert(result.AccessPointArn, Equals, "acs:oss:ap-southeast-2:128364106451****:accesspoint/ap-01")
+ c.Assert(result.Alias, Equals, "ap-01-45ee7945007a2f0bcb595f63e2215c****-ossalias")
+}
+
+func (s *OssTypeSuite) TestGetBucketAccessPointResult(c *C) {
+ xmlData := `
+
+ my-access-point
+ my-bucket
+ 1234567890
+ Internet
+
+ vpc-1234567890
+
+ my-access-point-arn
+ 2022-01-01T00:00:00Z
+ my-alias
+ Active
+
+ my-access-point.s3.amazonaws.com
+ my-access-point.internal.s3.amazonaws.com
+
+ `
+ var repResult GetBucketAccessPointResult
+ err := xmlUnmarshal(strings.NewReader(xmlData), &repResult)
+ c.Assert(err, IsNil)
+ c.Assert(repResult.AccessPointName, Equals, "my-access-point")
+ c.Assert(repResult.Bucket, Equals, "my-bucket")
+ c.Assert(repResult.AccountId, Equals, "1234567890")
+ c.Assert(repResult.NetworkOrigin, Equals, "Internet")
+ c.Assert(repResult.VpcId, Equals, "vpc-1234567890")
+ c.Assert(repResult.AccessPointArn, Equals, "my-access-point-arn")
+ c.Assert(repResult.CreationDate, Equals, "2022-01-01T00:00:00Z")
+ c.Assert(repResult.Alias, Equals, "my-alias")
+ c.Assert(repResult.Status, Equals, "Active")
+ c.Assert(repResult.Endpoints.PublicEndpoint, Equals, "my-access-point.s3.amazonaws.com")
+ c.Assert(repResult.Endpoints.InternalEndpoint, Equals, "my-access-point.internal.s3.amazonaws.com")
+
+ xmlData1 := `
+
+ my-access-point
+ my-bucket
+ 1234567890
+ Internet
+ my-access-point-arn
+ 2022-01-01T00:00:00Z
+ my-alias
+ Active
+
+ my-access-point.s3.amazonaws.com
+ my-access-point.internal.s3.amazonaws.com
+
+ `
+ var repResult1 GetBucketAccessPointResult
+ err = xmlUnmarshal(strings.NewReader(xmlData1), &repResult1)
+ c.Assert(err, IsNil)
+ c.Assert(repResult1.AccessPointName, Equals, "my-access-point")
+ c.Assert(repResult1.Bucket, Equals, "my-bucket")
+ c.Assert(repResult1.AccountId, Equals, "1234567890")
+ c.Assert(repResult1.NetworkOrigin, Equals, "Internet")
+ c.Assert(repResult1.VpcId, Equals, "")
+ c.Assert(repResult1.AccessPointArn, Equals, "my-access-point-arn")
+ c.Assert(repResult1.CreationDate, Equals, "2022-01-01T00:00:00Z")
+ c.Assert(repResult1.Alias, Equals, "my-alias")
+ c.Assert(repResult1.Status, Equals, "Active")
+ c.Assert(repResult1.Endpoints.PublicEndpoint, Equals, "my-access-point.s3.amazonaws.com")
+ c.Assert(repResult1.Endpoints.InternalEndpoint, Equals, "my-access-point.internal.s3.amazonaws.com")
+}
+
+func (s *OssTypeSuite) TestListBucketAccessPointResult(c *C) {
+ xmlData := `
+
+ true
+ abc
+ 111933544165****
+
+
+ oss-example
+ ap-01
+ ap-01-ossalias
+ vpc
+
+ vpc-t4nlw426y44rd3iq4****
+
+ enable
+
+
+ ap-02
+ access-point-name-2-1280*****-ossalias
+ oss-example
+ internet
+
+ enable
+
+
+`
+ var list ListBucketAccessPointsResult
+ err := xmlUnmarshal(strings.NewReader(xmlData), &list)
+ c.Assert(err, IsNil)
+ c.Assert(list.IsTruncated, Equals, true)
+ c.Assert(list.NextContinuationToken, Equals, "abc")
+ c.Assert(list.AccountId, Equals, "111933544165****")
+ c.Assert(list.AccessPoints[0].Bucket, Equals, "oss-example")
+ c.Assert(list.AccessPoints[0].AccessPointName, Equals, "ap-01")
+ c.Assert(list.AccessPoints[0].Alias, Equals, "ap-01-ossalias")
+ c.Assert(list.AccessPoints[0].NetworkOrigin, Equals, "vpc")
+ c.Assert(list.AccessPoints[0].VpcId, Equals, "vpc-t4nlw426y44rd3iq4****")
+ c.Assert(list.AccessPoints[0].Status, Equals, "enable")
+
+ c.Assert(list.AccessPoints[1].Bucket, Equals, "oss-example")
+ c.Assert(list.AccessPoints[1].AccessPointName, Equals, "ap-02")
+ c.Assert(list.AccessPoints[1].Alias, Equals, "access-point-name-2-1280*****-ossalias")
+ c.Assert(list.AccessPoints[1].NetworkOrigin, Equals, "internet")
+ c.Assert(list.AccessPoints[1].VpcId, Equals, "")
+ c.Assert(list.AccessPoints[1].Status, Equals, "enable")
+}
diff --git a/sample.go b/sample.go
index 72fe905..93ae47f 100644
--- a/sample.go
+++ b/sample.go
@@ -34,6 +34,7 @@ var sampleMap = map[string]interface{}{
"BucketCnameSample": sample.BucketCnameSample,
"BucketStyleSample": sample.BucketStyleSample,
"BucketReplicationSample": sample.BucketReplicationSample,
+ "BucketAccessPointSample": sample.BucketAccessPointSample,
"ObjectACLSample": sample.ObjectACLSample,
"ObjectMetaSample": sample.ObjectMetaSample,
"ListObjectsSample": sample.ListObjectsSample,
diff --git a/sample/bucket_accesspoint.go b/sample/bucket_accesspoint.go
new file mode 100644
index 0000000..a3cc2b7
--- /dev/null
+++ b/sample/bucket_accesspoint.go
@@ -0,0 +1,121 @@
+package sample
+
+import (
+ "fmt"
+ "github.com/aliyun/aliyun-oss-go-sdk/oss"
+)
+
+// BucketAccessPointSample how to set, get or delete the bucket access point.
+func BucketAccessPointSample() {
+ // New client
+ client, err := oss.New(endpoint, accessID, accessKey)
+ if err != nil {
+ HandleError(err)
+ }
+
+ // Create a bucket with default parameters
+ err = client.CreateBucket(bucketName)
+ if err != nil {
+ HandleError(err)
+ }
+
+ // Case 1:Create Bucket Access Point
+ apName := "access-point-name-1"
+ var create oss.CreateBucketAccessPoint
+ create.AccessPointName = apName
+ create.NetworkOrigin = "internet"
+ resp, err := client.CreateBucketAccessPoint(bucketName, create)
+ if err != nil {
+ HandleError(err)
+ }
+ fmt.Printf("Create Access Point Result Access Point Arn:%#v\n", resp.AccessPointArn)
+ fmt.Printf("Create Access Point Result Alias:%#v\n", resp.Alias)
+
+ // Case 2:Get Bucket Access Point
+ result, err := client.GetBucketAccessPoint(bucketName, apName)
+ if err != nil {
+ HandleError(err)
+ }
+ fmt.Printf("Get Access Point Result Bucket:%s\n", result.Bucket)
+ fmt.Printf("Get Access Point Result Access Point Name:%s\n", result.AccessPointName)
+ fmt.Printf("Get Access Point Result AccountId:%s\n", result.AccountId)
+ fmt.Printf("Get Access Point Result Network Origin:%s\n", result.NetworkOrigin)
+ fmt.Printf("Get Access Point Result Vpc Id:%s\n", result.VpcId)
+ fmt.Printf("Get Access Point Result Access Point Arn:%s\n", result.AccessPointArn)
+ fmt.Printf("Get Access Point Result Creation Date:%s\n", result.CreationDate)
+ fmt.Printf("Get Access Point Result Alias:%s\n", result.Alias)
+ fmt.Printf("Get Access Point Result Status:%s\n", result.Status)
+ fmt.Printf("Get Access Point Result Internal Endpoint :%s\n", result.Endpoints.InternalEndpoint)
+ fmt.Printf("Get Access Point Result Public Endpoint :%s\n", result.Endpoints.PublicEndpoint)
+
+ // Case 3:List Bucket Access Point
+ token := ""
+ for {
+ ls, err := client.ListBucketAccessPoint(bucketName, oss.ContinuationToken(token), oss.MaxKeys(100))
+ if err != nil {
+ HandleError(err)
+ }
+ fmt.Printf("List Bucket Access Point Is Truncated:%t\n", ls.IsTruncated)
+ fmt.Printf("List Bucket Access Point Next Continuation Token:%s\n", ls.NextContinuationToken)
+ fmt.Printf("List Bucket Access Point AccountId:%s\n", ls.AccountId)
+ for _, access := range ls.AccessPoints {
+ fmt.Printf("Access Point Bucket:%s\n", access.Bucket)
+ fmt.Printf("Access Point Name:%s\n", access.AccessPointName)
+ fmt.Printf("Access Point Alias:%s\n", access.Alias)
+ fmt.Printf("Access Point Network Origin:%s\n", access.NetworkOrigin)
+ fmt.Printf("Access Point Vpc Id:%s\n", access.VpcId)
+ fmt.Printf("Access Point Status:%s\n", access.Status)
+ }
+ if ls.IsTruncated {
+ token = ls.NextContinuationToken
+ } else {
+ break
+ }
+ }
+
+ // Case 4:Create Bucket Access Point Policy
+ policy := `{
+ "Version":"1",
+ "Statement":[
+ {
+ "Action":[
+ "oss:PutObject",
+ "oss:GetObject"
+ ],
+ "Effect":"Deny",
+ "Principal":["1234567890"],
+ "Resource":[
+ "acs:oss:*:1234567890:accesspoint/` + apName + `",
+ "acs:oss:*:1234567890:accesspoint/` + apName + `/object/*"
+ ]
+ }
+ ]
+ }`
+ err = client.PutAccessPointPolicy(bucketName, apName, policy)
+ if err != nil {
+ HandleError(err)
+ }
+ fmt.Println("Create Access Point Policy Success!")
+
+ // Case 5:Get Bucket Access Point Policy
+ policyInfo, err := client.GetAccessPointPolicy(bucketName, apName)
+ if err != nil {
+ HandleError(err)
+ }
+ fmt.Printf("Access Point Ploicy:%s\n", policyInfo)
+
+ // Case 6:Delete Bucket Access Point Policy
+ err = client.DeleteAccessPointPolicy(bucketName, apName)
+ if err != nil {
+ HandleError(err)
+ }
+ fmt.Println("Delete Access Point Policy Success!")
+
+ // Case 7:Delete Bucket Access Point
+ err = client.DeleteBucketAccessPoint(bucketName, apName)
+ if err != nil {
+ HandleError(err)
+ }
+ fmt.Println("Delete Bucket Replication Success!")
+ fmt.Println("BucketReplicationSample completed")
+}