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") +}