Ver Fonte

Merge pull request #95 from aliyun/fmt

Fmt
jxyowen há 7 anos atrás
pai
commit
bd9665f438

+ 1 - 1
.gitignore

@@ -11,4 +11,4 @@ build/
 dist/
 out/
 .gitignore
-
+coverage.*

+ 5 - 2
.travis.yml

@@ -1,11 +1,10 @@
 language: go
 
-sudo: false
-
 go:
   - 1.8.x
   - 1.9.x
   - 1.10.x
+  - 1.11.x
 
 branches:
   only:
@@ -28,4 +27,8 @@ script:
   - go vet ./services/...
   - go build ./sdk
   - go build ./services/...
+  - bash ./test.sh
   - go test -v -timeout 60m ./integration/...
+
+after_success:
+  - bash <(curl -s https://codecov.io/bash)

+ 9 - 0
Makefile

@@ -0,0 +1,9 @@
+
+all:
+
+fmt:
+	go fmt ./sdk ./integration ./services/...
+
+test:
+	go test -coverprofile=coverage.txt -covermode=atomic ./sdk
+	go tool cover -html=coverage.txt -o coverage.html

+ 4 - 3
README.md

@@ -1,6 +1,7 @@
 # Alibaba Cloud Go Software Development Kit
-[![Build Status](https://travis-ci.org/aliyun/alibaba-cloud-sdk-go.svg?branch=master)](https://travis-ci.org/aliyun/alibaba-cloud-sdk-go) 
+[![Build Status](https://travis-ci.org/aliyun/alibaba-cloud-sdk-go.svg?branch=master)](https://travis-ci.org/aliyun/alibaba-cloud-sdk-go)
 [![Go Report Card](https://goreportcard.com/badge/github.com/aliyun/alibaba-cloud-sdk-go)](https://goreportcard.com/report/github.com/aliyun/alibaba-cloud-sdk-go)
+[![codecov](https://codecov.io/gh/aliyun/alibaba-cloud-sdk-go/branch/master/graph/badge.svg)](https://codecov.io/gh/aliyun/alibaba-cloud-sdk-go)
 
 [中文文档](./README_zh.md)
 
@@ -47,7 +48,7 @@ import (
 	"fmt"
 )
 
-func main() { 
+func main() {
     // Create an ECS client
     ecsClient, err := ecs.NewClientWithAccessKey(
         "<your-region-id>", 			// Your Region ID
@@ -69,4 +70,4 @@ func main() {
     }
     fmt.Println(response)
 }
-```
+```

+ 18 - 17
README_zh.md

@@ -1,16 +1,17 @@
 # 阿里云开发者Go工具套件
-[![Build Status](https://travis-ci.org/aliyun/alibaba-cloud-sdk-go.svg?branch=master)](https://travis-ci.org/aliyun/alibaba-cloud-sdk-go) 
+[![Build Status](https://travis-ci.org/aliyun/alibaba-cloud-sdk-go.svg?branch=master)](https://travis-ci.org/aliyun/alibaba-cloud-sdk-go)
 [![Go Report Card](https://goreportcard.com/badge/github.com/aliyun/alibaba-cloud-sdk-go)](https://goreportcard.com/report/github.com/aliyun/alibaba-cloud-sdk-go)
+[![codecov](https://codecov.io/gh/aliyun/alibaba-cloud-sdk-go/branch/master/graph/badge.svg)](https://codecov.io/gh/aliyun/alibaba-cloud-sdk-go)
 
-欢迎使用阿里云开发者工具套件(SDK)。阿里云Go SDK让您不用复杂编程即可访问云服务器、云监控等多个阿里云服务。这里向您介绍如何获取阿里云Go SDK并开始调用。
+欢迎使用阿里云开发者工具套件(SDK)。阿里云 Go SDK 让您不用复杂编程即可访问云服务器、云监控等多个阿里云服务。这里向您介绍如何获取阿里云 Go SDK 并开始调用。
 
-如果您在使用SDK的过程中遇到任何问题,欢迎前往[阿里云SDK问答社区](https://yq.aliyun.com/tags/type_ask-tagid_23350)提问,提问前请阅读[提问引导](https://help.aliyun.com/document_detail/93957.html)。亦可在当前GitHub提交Issues。
+如果您在使用SDK的过程中遇到任何问题,欢迎前往[阿里云 SDK 问答社区](https://yq.aliyun.com/tags/type_ask-tagid_23350)提问,提问前请阅读[提问引导](https://help.aliyun.com/document_detail/93957.html)。亦可在当前 GitHub 提交 Issues。
 
 ## 环境准备
-1. 要使用阿里云Go SDK,您需要一个云账号以及一对`Access Key ID`和`Access Key Secret`。 请在阿里云控制台中的[AccessKey管理页面](https://usercenter.console.aliyun.com/?spm=5176.doc52740.2.3.QKZk8w#/manage/ak)上创建和查看您的Access Key,或者联系您的系统管理员
-2. 要使用阿里云SDK访问某个产品的API,您需要事先在[阿里云控制台](https://home.console.aliyun.com/?spm=5176.doc52740.2.4.QKZk8w)中开通这个产品。
+1. 要使用阿里云Go SDK,您需要一个云账号以及一对 `Access Key ID`  `Access Key Secret`。 请在阿里云控制台中的[ AccessKey 管理页面](https://usercenter.console.aliyun.com/?spm=5176.doc52740.2.3.QKZk8w#/manage/ak)上创建和查看您的 Access Key,或者联系您的系统管理员
+2. 要使用阿里云 SDK 访问某个产品的 API ,您需要事先在[阿里云控制台](https://home.console.aliyun.com/?spm=5176.doc52740.2.4.QKZk8w)中开通这个产品。
 
-## SDK获取和安装
+## SDK 获取和安装
 
 使用`go get`下载安装SDK
 
@@ -18,19 +19,19 @@
 go get -u github.com/aliyun/alibaba-cloud-sdk-go/sdk
 ```
 
-如果您使用了glide管理依赖,您也可以使用glide来安装阿里云GO SDK
+如果您使用了 glide 管理依赖,您也可以使用 glide 来安装阿里云GO SDK
 
 ```
 glide get github.com/aliyun/alibaba-cloud-sdk-go
 ```
 
-另外,阿里云Go SDK也会发布在 https://develop.aliyun.com/tools/sdk#/go 这个地址。
+另外,阿里云 Go SDK 也会发布在 https://develop.aliyun.com/tools/sdk#/go 这个地址。
 
 ## 开始调用
-以下这个代码示例向您展示了调用阿里云GO SDK的3个主要步骤:
+以下这个代码示例向您展示了调用阿里云 GO SDK 的3个主要步骤:
 
-1. 创建Client实例
-2. 创建API请求并设置参数
+1. 创建 Client 实例
+2. 创建 API 请求并设置参数
 3. 发起请求并处理异常
 
 ```go
@@ -41,7 +42,7 @@ import (
 	"fmt"
 )
 
-func main() { 
+func main() {
     // 创建ecsClient实例
     ecsClient, err := ecs.NewClientWithAccessKey(
         "<your-region-id>", 			// 您的可用区ID
@@ -97,7 +98,7 @@ config := sdk.NewConfig()
             .WithEnableAsync(true)
             .WithGoRoutinePoolSize(poolSize)            // 可选,默认5
             .WithMaxTaskQueueSize(maxTaskQueueSize)     // 可选,默认1000
-ecsClient, err := ecs.NewClientWithOptions(config)            
+ecsClient, err := ecs.NewClientWithOptions(config)
 
 // 也可以在client初始化后再开启
 client.EnableAsync(poolSize, maxTaskQueueSize)
@@ -109,24 +110,24 @@ client.EnableAsync(poolSize, maxTaskQueueSize)
 1. 使用channel作为返回值
     ```go
     responseChannel, errChannel := client.FooWithChan(request)
-    
+
     // this will block
     response := <-responseChannel
     err = <-errChannel
     ```
 
 2. 使用callback控制回调
-    
+
     ```go
     blocker := client.FooWithCallback(request, func(response *FooResponse, err error) {
     		// handle the response and err
     	})
- 	
+
     // blocker 为(chan int),用于控制同步,返回1为成功,0为失败
     // 在<-blocker返回失败时,err依然会被传入的callback处理
     result := <-blocker
     ```
-    
+
 ## 泛化调用接口(CommonApi)
 
 ##### 什么是CommonAPI

+ 3 - 3
sdk/client.go

@@ -252,9 +252,9 @@ func (client *Client) DoActionWithSigner(request requests.AcsRequest, response r
 		if err != nil {
 			if !client.config.AutoRetry {
 				return
-			//} else if timeout = isTimeout(err); !timeout {
-			//	// if not timeout error, return
-			//	return
+				//} else if timeout = isTimeout(err); !timeout {
+				//	// if not timeout error, return
+				//	return
 			} else if retryTimes >= client.config.MaxRetryTime {
 				// timeout but reached the max retry times, return
 				timeoutErrorMsg := fmt.Sprintf(errors.TimeoutErrorMessage, strconv.Itoa(retryTimes+1), strconv.Itoa(retryTimes+1))

+ 5 - 0
sdk/endpoints/local_global_resolver.go

@@ -23,6 +23,11 @@ import (
 type LocalGlobalResolver struct {
 }
 
+func (resolver *LocalGlobalResolver) GetName() (name string) {
+  name = "local global resolver"
+  return
+}
+
 func (resolver *LocalGlobalResolver) TryResolve(param *ResolveParam) (endpoint string, support bool, err error) {
 	// get the global endpoints configs
 	endpointExpression := fmt.Sprintf("products[?code=='%s'].global_endpoint", strings.ToLower(param.Product))

+ 5 - 0
sdk/endpoints/local_regional_resolver.go

@@ -23,6 +23,11 @@ import (
 type LocalRegionalResolver struct {
 }
 
+func (resolver *LocalRegionalResolver) GetName() (name string) {
+  name = "local regional resolver"
+  return
+}
+
 func (resolver *LocalRegionalResolver) TryResolve(param *ResolveParam) (endpoint string, support bool, err error) {
 	// get the regional endpoints configs
 	regionalExpression := fmt.Sprintf("products[?code=='%s'].regional_endpoints", strings.ToLower(param.Product))

+ 5 - 0
sdk/endpoints/location_resolver.go

@@ -48,6 +48,11 @@ var endpointCache = Cache{cache: make(map[string]interface{})}
 type LocationResolver struct {
 }
 
+func (resolver *LocationResolver) GetName() (name string) {
+  name = "location resolver"
+  return
+}
+
 func (resolver *LocationResolver) TryResolve(param *ResolveParam) (endpoint string, support bool, err error) {
 	if len(param.LocationProduct) <= 0 {
 		support = false

+ 5 - 0
sdk/endpoints/mapping_resolver.go

@@ -32,6 +32,11 @@ func AddEndpointMapping(regionId, productId, endpoint string) (err error) {
 type MappingResolver struct {
 }
 
+func (resolver *MappingResolver) GetName() (name string) {
+  name = "mapping resolver"
+  return
+}
+
 func (resolver *MappingResolver) TryResolve(param *ResolveParam) (endpoint string, support bool, err error) {
 	key := fmt.Sprintf(keyFormatter, strings.ToLower(param.RegionId), strings.ToLower(param.Product))
 	endpoint, contains := endpointMapping[key]

+ 17 - 3
sdk/endpoints/mapping_resolver_test.go

@@ -6,14 +6,28 @@ import (
 	"testing"
 )
 
+func TestMappingResolver_GetName(t *testing.T) {
+	resolver := &MappingResolver{}
+	assert.Equal(t, resolver.GetName(), "mapping resolver")
+}
+
 func TestMappingResolver_TryResolve(t *testing.T) {
-	AddEndpointMapping("cn-hangzhou", "Ecs", "unreachable.aliyuncs.com")
+	resolver := &MappingResolver{}
 	resolveParam := &ResolveParam{
 		RegionId: "cn-hangzhou",
 		Product:  "ecs",
 	}
-	endpoint, err := Resolve(resolveParam)
+	endpoint, support, err := resolver.TryResolve(resolveParam)
+	assert.Nil(t, err)
+	assert.Equal(t, "", endpoint)
+	assert.Equal(t, false, support)
+
+	AddEndpointMapping("cn-hangzhou", "Ecs", "unreachable.aliyuncs.com")
+
+	endpoint, support, err = resolver.TryResolve(resolveParam)
 	assert.Nil(t, err)
-	assert.Equal(t, endpoint, "unreachable.aliyuncs.com")
+	assert.Equal(t, "unreachable.aliyuncs.com", endpoint)
+	assert.Equal(t, true, support)
+
 	fmt.Println("finished")
 }

+ 10 - 0
sdk/endpoints/resolver.go

@@ -17,12 +17,19 @@ package endpoints
 import (
 	"encoding/json"
 	"fmt"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
 	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/errors"
 	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
 	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/responses"
 	"sync"
 )
 
+var debug utils.Debug
+
+func init() {
+	debug = utils.Init("sdk")
+}
+
 const (
 	ResolveEndpointUserGuideLink = ""
 )
@@ -32,6 +39,7 @@ var resolvers []Resolver
 
 type Resolver interface {
 	TryResolve(param *ResolveParam) (endpoint string, support bool, err error)
+	GetName() (name string)
 }
 
 func Resolve(param *ResolveParam) (endpoint string, err error) {
@@ -39,6 +47,8 @@ func Resolve(param *ResolveParam) (endpoint string, err error) {
 	for _, resolver := range supportedResolvers {
 		endpoint, supported, err := resolver.TryResolve(param)
 		if supported {
+			debug("resolve endpoint with %s\n", param)
+			debug("\t%s by resolver(%s)\n", endpoint, resolver.GetName())
 			return endpoint, err
 		}
 	}

+ 5 - 0
sdk/endpoints/simple_host_resolver.go

@@ -17,6 +17,11 @@ package endpoints
 type SimpleHostResolver struct {
 }
 
+func (resolver *SimpleHostResolver) GetName() (name string) {
+  name = "simple host resolver"
+  return
+}
+
 func (resolver *SimpleHostResolver) TryResolve(param *ResolveParam) (endpoint string, support bool, err error) {
 	if support = len(param.Domain) > 0; support {
 		endpoint = param.Domain

+ 31 - 0
sdk/endpoints/simple_host_resolver_test.go

@@ -0,0 +1,31 @@
+package endpoints
+
+import (
+  "fmt"
+  "github.com/stretchr/testify/assert"
+  "testing"
+)
+
+func TestSimpleHostResolver_GetName(t *testing.T) {
+  resolver := &SimpleHostResolver{}
+  assert.Equal(t, resolver.GetName(), "simple host resolver")
+}
+
+func TestSimpleHostResolver_TryResolve(t *testing.T) {
+  resolver := &SimpleHostResolver{}
+  resolveParam := &ResolveParam{}
+  endpoint, support, err := resolver.TryResolve(resolveParam)
+  assert.Nil(t, err)
+  assert.Equal(t, "", endpoint)
+  assert.Equal(t, false, support)
+
+  resolveParam = &ResolveParam{
+    Domain: "unreachable.aliyuncs.com",
+  }
+  endpoint, support, err = resolver.TryResolve(resolveParam)
+  assert.Nil(t, err)
+  assert.Equal(t, "unreachable.aliyuncs.com", endpoint)
+  assert.Equal(t, true, support)
+
+  fmt.Println("finished")
+}

+ 28 - 0
sdk/utils/debug.go

@@ -0,0 +1,28 @@
+package utils
+
+import (
+  "fmt"
+  "strings"
+  "os"
+)
+
+type Debug func(format string, v ...interface{})
+
+func Init(flag string) Debug {
+  enable := false
+
+  env := os.Getenv("DEBUG")
+  parts := strings.Split(env, ",")
+  for _, part := range parts {
+    if part == flag {
+      enable = true
+      break
+    }
+  }
+
+  return func (format string, v ...interface{}) {
+    if enable {
+      fmt.Println(fmt.Sprintf(format, v...))
+    }
+  }
+}

+ 11 - 0
sdk/utils/debug_test.go

@@ -0,0 +1,11 @@
+package utils
+
+import (
+  "testing"
+  // "fmt"
+)
+
+func TestMain(m *testing.M) {
+  debug := Init("sdk")
+  debug("%s", "testing")
+}

+ 12 - 0
test.sh

@@ -0,0 +1,12 @@
+#!/usr/bin/env bash
+
+set -e
+echo "" > coverage.txt
+
+for d in $(go list ./sdk/... | grep -v vendor); do
+    go test -race -coverprofile=profile.out -covermode=atomic $d
+    if [ -f profile.out ]; then
+        cat profile.out >> coverage.txt
+        rm profile.out
+    fi
+done