Browse Source

breakpoint

Signed-off-by: 高汝彤 <rutong.grt@alibaba-inc.com>
高汝彤 8 years ago
parent
commit
735198df33
3 changed files with 56 additions and 46 deletions
  1. 23 14
      sdk/client.go
  2. 26 31
      sdk/client_test.go
  3. 7 1
      sdk/responses/json_parser_test.go

+ 23 - 14
sdk/client.go

@@ -189,13 +189,22 @@ func (client *Client) DoActionWithSigner(request requests.AcsRequest, response r
 	var httpResponse *http.Response
 	for retryTimes := 0; retryTimes < client.config.MaxRetryTime; retryTimes++ {
 		httpResponse, err = client.httpClient.Do(httpRequest)
-		// if status code >= 500 or timeout, will trigger retry
-		if client.config.AutoRetry && isNeedRetry(httpResponse, err){
-			continue
-		}
-		// receive error but not timeout
+
+		// retry params
+		var timeout bool
+		var serverError bool
+
+		// receive error
 		if err != nil {
-			return
+			// if not timeout error, return
+			if timeout = isTimeout(err); !timeout {
+				return
+			}
+		}
+		serverError = isServerError(httpResponse)
+		//  if status code >= 500 or timeout, will trigger retry
+		if client.config.AutoRetry && (timeout || serverError) {
+			continue
 		}
 		break
 	}
@@ -203,16 +212,16 @@ func (client *Client) DoActionWithSigner(request requests.AcsRequest, response r
 	return
 }
 
-func isNeedRetry(response *http.Response, err error) bool {
-	if response.StatusCode >= http.StatusInternalServerError {
-		// internal server error
-		return true
-	}else if  err, ok := err.(net.Error); ok && err.Timeout() {
-		// timeout
-		return true
-	}else{
+func isTimeout(err error) bool {
+	if err == nil {
 		return false
 	}
+	netErr, isNetError := err.(net.Error)
+	return isNetError && netErr.Timeout()
+}
+
+func isServerError(httpResponse *http.Response) bool {
+	return httpResponse.StatusCode >= http.StatusInternalServerError
 }
 
 func (client *Client) AddAsyncTask(task func()) (err error) {

+ 26 - 31
sdk/client_test.go

@@ -25,6 +25,7 @@ import (
 	"os"
 	"os/user"
 	"testing"
+	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/auth/credentials"
 )
 
 var client, clientKeyPair, clientEcs, clientRoleArn *Client
@@ -89,45 +90,39 @@ func getConfigFromEnv() *TestConfig {
 }
 
 func testSetup() {
-	config := getConfigFromEnv()
-	if config == nil {
-		config = getConfigFromFile()
+	testConfig := getConfigFromEnv()
+	if testConfig == nil {
+		testConfig = getConfigFromFile()
 	}
+
+	clientConfig := NewConfig().
 	tr := &http.Transport{
 		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
 	}
-	client = &Client{
-		config: &Config{
-			HttpTransport: tr,
-		},
-	}
-	clientEcs = &Client{}
-	clientRoleArn = &Client{
-		config: &Config{
-			HttpTransport: tr,
-		},
-	}
-	clientKeyPair = &Client{
-		config: &Config{
-			HttpTransport: tr,
-		},
-	}
-	err := client.InitWithAccessKey("cn-hangzhou", config.AccessKeyId, config.AccessKeySecret)
-	if err != nil {
-		panic(err)
-	}
-	err = clientKeyPair.InitWithKeyPair("cn-hangzhou", config.PublicKeyId, config.PrivateKey, 3600)
-	if err != nil {
-		panic(err)
-	}
-	err = clientEcs.InitWithEcsInstance("cn-hangzhou", "conan")
-	if err != nil {
-		panic(err)
+
+	var err error
+	credential := &credentials.BaseCredential{
+		AccessKeyId:     testConfig.AccessKeyId,
+		AccessKeySecret: testConfig.AccessKeySecret,
 	}
-	err = clientRoleArn.InitWithRoleArn("cn-hangzhou", config.ChildAK, config.ChildSecret, config.RoleArn, "clientTest")
+	client, err = NewClientWith
 	if err != nil {
 		panic(err)
 	}
+	client.config.HttpTransport = tr
+
+	//err = clientKeyPair.InitWithKeyPair("cn-hangzhou", testConfig.PublicKeyId, testConfig.PrivateKey, 3600)
+	//if err != nil {
+	//	panic(err)
+	//}
+	//err = clientEcs.InitWithEcsInstance("cn-hangzhou", "conan")
+	//if err != nil {
+	//	panic(err)
+	//}
+	//err = clientRoleArn.InitWithRoleArn("cn-hangzhou", testConfig.ChildAK, testConfig.ChildSecret, testConfig.RoleArn, "clientTest")
+	//if err != nil {
+	//	panic(err)
+	//}
 }
 
 func testTearDown() {

+ 7 - 1
sdk/responses/json_parser_test.go

@@ -5,9 +5,10 @@ import (
 	"encoding/json"
 	"github.com/stretchr/testify/assert"
 	"fmt"
+	"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
 )
 
-func TestUnmarshal(t *testing.T) {
+func TestFuzzyFieldUnmarshal(t *testing.T) {
 	from, err := getJsonBytes()
 	if err != nil {
 		panic(err)
@@ -50,6 +51,11 @@ func TestUnmarshal(t *testing.T) {
 	assert.Equal(t, "", to.EmptyStrToStr)
 }
 
+func TestFuzzyTypeUnmarshal(t *testing.T){
+	arrayJson := \"[{\"instance_type\":\"ecs.n4.large\",\"vpc_id\":\"\",\"vswitch_id\":\"\",\"vswitch_cidr\":\"\",\"image_id\":\"registry-internal.cn-beijing.aliyuncs.com/acs/agent\",\"data_disk_size\":0,\"data_disk_category\":\"cloud_ssd\",\"security_group_id\":\"sg-2ze57kc2cf36f9mrsrjx\",\"tags\":\"\",\"zone_id\":\"cn-beijing-a\",\"-\":\"PayByTraffic\",\"name\":\"Hello\",\"cluster_id\":\"ca737c2c04143464eaf439e245ceb1bf4\",\"size\":3,\"region_id\":\"cn-beijing\",\"network_mode\":\"classic\",\"subnet_cidr\":\"172.18.1.1/24\",\"state\":\"running\",\"master_url\":\"https://master4g7.cs-cn-beijing.aliyun.com:20019\",\"agent_version\":\"0.9-cdb96d4\",\"external_loadbalancer_id\":\"lb-2zegrgbsmjvxx1r1v26pn\",\"internal_master_url\":\"https://master4g7.cs-cn-beijing.aliyun-inc.com:20019\",\"port\":20019,\"node_status\":\"{\\"health\\":0,\\"unhealth\\":3}\",\"cluster_healthy\":\"unhealth\",\"docker_version\":\"17.06.1-ce\",\"cluster_type\":\"aliyun\",\"swarm_mode\":true,\"init_version\":\"\",\"current_version\":\"\",\"meta_data\":\"\",\"upgrade_components\":null,\"capabilities\":{\"acslogging\":true,\"acsrouting\":true,\"blue-green_confirm\":true,\"blue-green_deployment\":true,\"cluster_event\":true,\"compose_v2\":true,\"config_map\":true,\"cron\":true,\"default_update_method\":true,\"drain\":true,\"logging_sls\":true,\"monitoring\":true,\"node_scaling\":true,\"porject_event_deletion\":true,\"porject_trigger\":true,\"rebalance\":true,\"reset_node\":true,\"routing_custom_root_domain\":true,\"routing_slb\":true,\"scalingtrigger\":true,\"slb-blue-green_deployment\":true,\"update_force_reschedule\":true,\"volume_ossfs\":true,\"volume_yunpan\":true},\"need_update_agent\":false,\"created\":\"2017-09-12T07:26:58Z\",\"updated\":\"2017-12-26T11:36:41Z\",\"outputs\":null,\"parameters\":null}]\";
+	
+}
+
 func getJsonBytes() ([]byte, error) {
 	from := &From{
 		StrToStr:            "demo string",