2017-03-03 04:19:16 -05:00
|
|
|
package common
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"log"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/denverdino/aliyungo/util"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Constants for Aliyun API requests
|
|
|
|
const (
|
|
|
|
SignatureVersion = "1.0"
|
|
|
|
SignatureMethod = "HMAC-SHA1"
|
|
|
|
JSONResponseFormat = "JSON"
|
|
|
|
XMLResponseFormat = "XML"
|
|
|
|
ECSRequestMethod = "GET"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Request struct {
|
|
|
|
Format string
|
|
|
|
Version string
|
2017-11-27 21:22:16 -05:00
|
|
|
RegionId Region
|
2017-03-03 04:19:16 -05:00
|
|
|
AccessKeyId string
|
2017-11-27 21:22:16 -05:00
|
|
|
SecurityToken string
|
2017-03-03 04:19:16 -05:00
|
|
|
Signature string
|
|
|
|
SignatureMethod string
|
|
|
|
Timestamp util.ISO6801Time
|
|
|
|
SignatureVersion string
|
|
|
|
SignatureNonce string
|
|
|
|
ResourceOwnerAccount string
|
|
|
|
Action string
|
|
|
|
}
|
|
|
|
|
2017-11-27 21:22:16 -05:00
|
|
|
func (request *Request) init(version string, action string, AccessKeyId string, securityToken string, regionId Region) {
|
2017-03-03 04:19:16 -05:00
|
|
|
request.Format = JSONResponseFormat
|
|
|
|
request.Timestamp = util.NewISO6801Time(time.Now().UTC())
|
|
|
|
request.Version = version
|
|
|
|
request.SignatureVersion = SignatureVersion
|
|
|
|
request.SignatureMethod = SignatureMethod
|
|
|
|
request.SignatureNonce = util.CreateRandomString()
|
|
|
|
request.Action = action
|
|
|
|
request.AccessKeyId = AccessKeyId
|
2017-11-27 21:22:16 -05:00
|
|
|
request.SecurityToken = securityToken
|
|
|
|
request.RegionId = regionId
|
2017-03-03 04:19:16 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
type Response struct {
|
|
|
|
RequestId string
|
|
|
|
}
|
|
|
|
|
|
|
|
type ErrorResponse struct {
|
|
|
|
Response
|
|
|
|
HostId string
|
|
|
|
Code string
|
|
|
|
Message string
|
|
|
|
}
|
|
|
|
|
|
|
|
// An Error represents a custom error for Aliyun API failure response
|
|
|
|
type Error struct {
|
|
|
|
ErrorResponse
|
|
|
|
StatusCode int //Status Code of HTTP Response
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *Error) Error() string {
|
|
|
|
return fmt.Sprintf("Aliyun API Error: RequestId: %s Status Code: %d Code: %s Message: %s", e.RequestId, e.StatusCode, e.Code, e.Message)
|
|
|
|
}
|
|
|
|
|
|
|
|
type Pagination struct {
|
|
|
|
PageNumber int
|
|
|
|
PageSize int
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Pagination) SetPageSize(size int) {
|
|
|
|
p.PageSize = size
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *Pagination) Validate() {
|
|
|
|
if p.PageNumber < 0 {
|
|
|
|
log.Printf("Invalid PageNumber: %d", p.PageNumber)
|
|
|
|
p.PageNumber = 1
|
|
|
|
}
|
|
|
|
if p.PageSize < 0 {
|
|
|
|
log.Printf("Invalid PageSize: %d", p.PageSize)
|
|
|
|
p.PageSize = 10
|
|
|
|
} else if p.PageSize > 50 {
|
|
|
|
log.Printf("Invalid PageSize: %d", p.PageSize)
|
|
|
|
p.PageSize = 50
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// A PaginationResponse represents a response with pagination information
|
|
|
|
type PaginationResult struct {
|
|
|
|
TotalCount int
|
|
|
|
PageNumber int
|
|
|
|
PageSize int
|
|
|
|
}
|
|
|
|
|
|
|
|
// NextPage gets the next page of the result set
|
|
|
|
func (r *PaginationResult) NextPage() *Pagination {
|
|
|
|
if r.PageNumber*r.PageSize >= r.TotalCount {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &Pagination{PageNumber: r.PageNumber + 1, PageSize: r.PageSize}
|
|
|
|
}
|