Browse Source

complete integration

Signed-off-by: 高汝彤 <rutong.grt@alibaba-inc.com>
高汝彤 8 năm trước cách đây
mục cha
commit
1853ccd0df

+ 30 - 0
integration/cdn_test.go

@@ -0,0 +1,30 @@
+package integration
+
+import (
+	"testing"
+	"fmt"
+	"github.com/aliyun/alibaba-cloud-sdk-go/services/cdn"
+	"github.com/stretchr/testify/assert"
+)
+
+func TestCdnInstance(t *testing.T) {
+
+	// init client
+	config := getConfigFromEnv()
+	cdnClient, err := cdn.NewClientWithAccessKey("cn-hangzhou", config.AccessKeyId, config.AccessKeySecret)
+	assertErrorNil(t, err, "Failed to init client")
+	fmt.Printf("Init client success\n")
+
+	// getCdnStatus
+	assertCdnStatus(t, cdnClient)
+}
+
+func assertCdnStatus(t *testing.T, client *cdn.Client){
+	fmt.Print("describing cdn service status...")
+	request := cdn.CreateDescribeCdnServiceRequest()
+	response, err := client.DescribeCdnService(request)
+	assertErrorNil(t, err, "Failed to describing cdn service status")
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	assert.Equal(t, "PayByTraffic", response.InternetChargeType)
+	fmt.Printf("ok(%d)!\n", response.GetHttpStatus())
+}

+ 186 - 0
integration/rds_test.go

@@ -0,0 +1,186 @@
+package integration
+
+import (
+	"testing"
+	"fmt"
+	"github.com/aliyun/alibaba-cloud-sdk-go/services/rds"
+	"github.com/stretchr/testify/assert"
+	"time"
+	"strconv"
+	"strings"
+)
+
+const (
+	RdsInstanceDefaultTimeout = 120
+	RdsDefaultWaitForInterval = 60
+
+	RdsInstanceStatusRunning = "Running"
+	RdsInstanceStatusStopped = "Stopped"
+	RdsInstanceStatusDeleted = "Deleted"
+)
+
+func TestRdsInstance(t *testing.T) {
+
+	// init client
+	config := getConfigFromEnv()
+	rdsClient, err := rds.NewClientWithAccessKey("cn-hangzhou", config.AccessKeyId, config.AccessKeySecret)
+	assertErrorNil(t, err, "Failed to init client")
+	fmt.Printf("Init client success\n")
+
+	dbInstanceId := createDBInstance(t, rdsClient)
+
+	waitForRdsInstance(t, rdsClient, dbInstanceId, RdsInstanceStatusRunning, 1200)
+
+	createAccount(t, rdsClient, dbInstanceId)
+
+	//nodeId := getHAConfig(t, rdsClient, dbInstanceId)
+	//
+	//changeNodeToMaster(t, rdsClient, dbInstanceId, nodeId)
+	//
+	//createDataBase(t, rdsClient, dbInstanceId)
+
+	deleteDBInstance(t, rdsClient, dbInstanceId)
+
+	deleteAllTestRdsInstance(t, rdsClient)
+}
+
+func createDBInstance(t *testing.T, client *rds.Client) (rdsInstanceId string) {
+	fmt.Print("creating rds mysql instance...")
+	request := rds.CreateCreateDBInstanceRequest()
+	request.Engine = "MySQL"
+	request.EngineVersion = "5.7"
+	request.DBInstanceClass = "mysql.n1.micro.1"
+	request.DBInstanceStorage = "20"
+	request.DBInstanceNetType = "Intranet"
+	request.SecurityIPList = "0.0.0.0/0"
+	request.PayType = "Postpaid"
+	request.DBInstanceDescription = InstanceNamePrefix + strconv.FormatInt(time.Now().Unix(), 10)
+	response, err := client.CreateDBInstance(request)
+	assertErrorNil(t, err, "Failed to create rds mysql instance")
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	rdsInstanceId = response.DBInstanceId
+	fmt.Printf("success(%d)! dbInstanceId = %s\n", response.GetHttpStatus(), rdsInstanceId)
+	return
+}
+
+func getHAConfig(t *testing.T, client *rds.Client, instanceId string)(nodeId string){
+	fmt.Print("get dbInstance HA nodeId...")
+	request := rds.CreateDescribeDBInstanceHAConfigRequest()
+	request.DBInstanceId = instanceId
+	response, err := client.DescribeDBInstanceHAConfig(request)
+	assertErrorNil(t, err, "Failed to get dbInstance HA nodeId")
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	nodeId = response.HostInstanceInfos.NodeInfo[0].NodeId
+	fmt.Printf("success(%d)! nodeId = %s\n", response.GetHttpStatus(), nodeId)
+	return
+}
+
+func changeNodeToMaster(t *testing.T, client *rds.Client, instanceId, nodeId string){
+	fmt.Print("trying to change current instance to master...")
+	request := rds.CreateSwitchDBInstanceHARequest()
+	request.DBInstanceId = instanceId
+	request.NodeId = nodeId
+	response, err := client.SwitchDBInstanceHA(request)
+	assertErrorNil(t, err, "Failed to change current instance to master")
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	fmt.Printf("success(%d)!\n", response.GetHttpStatus())
+	return
+}
+
+func createAccount(t *testing.T, client *rds.Client, instanceId string) {
+	fmt.Print("creating mysql account...")
+	request := rds.CreateCreateAccountRequest()
+	request.DBInstanceId = instanceId
+	request.AccountName = "sdktest"
+	request.AccountPassword = strconv.FormatInt(time.Now().Unix(), 10)
+	response, err := client.CreateAccount(request)
+	assertErrorNil(t, err, "Failed to create mysql account")
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	fmt.Printf("success(%d)!\n", response.GetHttpStatus())
+	return
+}
+
+func createDataBase(t *testing.T, client *rds.Client, instanceId string) {
+	fmt.Print("creating mysql database...")
+	request := rds.CreateCreateDatabaseRequest()
+	request.DBInstanceId = instanceId
+	request.DBName = "sdktest"
+	request.CharacterSetName = "utf8"
+	response, err := client.CreateDatabase(request)
+	assertErrorNil(t, err, "Failed to create mysql database")
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	fmt.Printf("success(%d)!\n", response.GetHttpStatus())
+	return
+}
+
+func deleteDBInstance(t *testing.T, client *rds.Client, instanceId string) {
+	fmt.Print("deleting rds instance...")
+	request := rds.CreateDeleteDBInstanceRequest()
+	request.DBInstanceId = instanceId
+	response, err := client.DeleteDBInstance(request)
+	assertErrorNil(t, err, "Failed to delete rds instance")
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	fmt.Printf("success(%d)!\n", response.GetHttpStatus())
+	return
+}
+
+func waitForRdsInstance(t *testing.T, client *rds.Client, instanceId string, targetStatus string, timeout int) {
+	if timeout <= 0 {
+		timeout = RdsInstanceDefaultTimeout
+	}
+	for {
+		request := rds.CreateDescribeDBInstanceAttributeRequest()
+		request.DBInstanceId = instanceId
+		response, err := client.DescribeDBInstanceAttribute(request)
+
+		currentStatus := getSingleInstanceStatusFromDescribeDBInstanceAttributeResponse(response)
+		if targetStatus == RdsInstanceStatusDeleted {
+			if currentStatus == targetStatus {
+				fmt.Printf("delete rds instance(%s) success\n", instanceId)
+				break
+			} else {
+				assertErrorNil(t, err, "Failed to describe rds instance \n")
+			}
+		} else {
+			assertErrorNil(t, err, "Failed to describe rds instance \n")
+			if currentStatus == targetStatus {
+				fmt.Printf("rds instance(%s) status changed to %s, wait a moment\n", instanceId, targetStatus)
+				time.Sleep(RdsDefaultWaitForInterval * time.Second)
+				break
+			} else {
+				fmt.Printf("rds instance(%s) status is %s, wait for changing to %s\n", instanceId, currentStatus, targetStatus)
+			}
+		}
+
+		timeout = timeout - RdsDefaultWaitForInterval
+		if timeout <= 0 {
+			t.Errorf(fmt.Sprintf("wait for ecs instance(%s) status to %s timeout(%d)\n", instanceId, targetStatus, timeout))
+		}
+		time.Sleep(RdsDefaultWaitForInterval * time.Second)
+	}
+}
+
+func deleteAllTestRdsInstance(t *testing.T, client *rds.Client) {
+	// list all instances
+	fmt.Print("trying to list all rds test instances...")
+	listRequest := rds.CreateDescribeDBInstancesRequest()
+	listResponse, err := client.DescribeDBInstances(listRequest)
+	assertErrorNil(t, err, "Failed to list all rds instances")
+	assert.Equal(t, 200, listResponse.GetHttpStatus(), listResponse.GetHttpContentString())
+
+	fmt.Printf("found %s instances\n", strconv.Itoa(listResponse.TotalRecordCount))
+	for _, instance := range listResponse.Items.DBInstance {
+		if strings.HasPrefix(instance.DBInstanceDescription, InstanceNamePrefix) {
+			fmt.Printf("found test instance(%s), trying to delte it\n", instance.DBInstanceId)
+			deleteDBInstance(t, client, instance.DBInstanceId)
+		}
+	}
+
+}
+
+func getSingleInstanceStatusFromDescribeDBInstanceAttributeResponse(response *rds.DescribeDBInstanceAttributeResponse) string {
+	if response.GetHttpStatus() == 404 || len(response.Items.DBInstanceAttribute) == 0 {
+		return RdsInstanceStatusDeleted
+	}
+	return response.Items.DBInstanceAttribute[0].DBInstanceStatus
+}

+ 1 - 1
integration/utils.go

@@ -29,7 +29,7 @@ func getConfigFromEnv() *Config {
 		ChildSecret:     os.Getenv("CHILD_SECRET"),
 	}
 	if config.AccessKeyId == "" {
-		return nil
+		panic("Get ACCESS_KEY_ID from environment variables failed")
 	} else {
 		return config
 	}

+ 85 - 0
integration/vpc_test.go

@@ -0,0 +1,85 @@
+package integration
+
+import (
+	"testing"
+	"fmt"
+	"github.com/aliyun/alibaba-cloud-sdk-go/services/vpc"
+	"strconv"
+	"time"
+	"github.com/stretchr/testify/assert"
+)
+
+func TestVpcInstance(t *testing.T) {
+
+	// init client
+	config := getConfigFromEnv()
+	vpcClient, err := vpc.NewClientWithAccessKey("cn-hangzhou", config.AccessKeyId, config.AccessKeySecret)
+	assertErrorNil(t, err, "Failed to init client")
+	fmt.Printf("Init client success\n")
+
+	// create vpc
+	vpcId := createVpcInstance(t, vpcClient)
+
+	time.Sleep(5 * time.Second)
+
+	// create switch
+	vswitchId := createVswitchInstance(t, vpcClient, vpcId)
+
+	time.Sleep(5 * time.Second)
+
+	// delete vswitch
+	deleteVSwitchInstance(t, vpcClient, vswitchId)
+
+	// delete vpc
+	deleteVpcInstance(t, vpcClient, vpcId)
+}
+
+func createVpcInstance(t *testing.T, client *vpc.Client) (vpcId string) {
+	fmt.Print("creating vpc instance...")
+	request := vpc.CreateCreateVpcRequest()
+	request.VpcName = InstanceNamePrefix + strconv.FormatInt(time.Now().Unix(), 10)
+	request.CidrBlock = "192.168.0.0/16"
+	response, err := client.CreateVpc(request)
+	assertErrorNil(t, err, "Failed to create vpc instance")
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	vpcId = response.VpcId
+	fmt.Printf("success(%d)! vpcId = %s\n", response.GetHttpStatus(), vpcId)
+	return
+}
+
+func createVswitchInstance(t *testing.T, client *vpc.Client, vpcId string) (vswitchId string) {
+	fmt.Print("creating vswitch instance...")
+	request := vpc.CreateCreateVSwitchRequest()
+	request.VSwitchName = InstanceNamePrefix + strconv.FormatInt(time.Now().Unix(), 10)
+	request.VpcId = vpcId
+	request.ZoneId = "cn-hangzhou-b"
+	request.CidrBlock = "192.168.3.0/24"
+	response, err := client.CreateVSwitch(request)
+	assertErrorNil(t, err, "Failed to create vswitch instance")
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	vswitchId = response.VSwitchId
+	fmt.Printf("success(%d)! VSwitchId = %s\n", response.GetHttpStatus(), vpcId)
+	return
+}
+
+func deleteVSwitchInstance(t *testing.T, client *vpc.Client, vswitchId string)() {
+	fmt.Printf("deleting vswitch instance(%s)...", vswitchId)
+	request := vpc.CreateDeleteVSwitchRequest()
+	request.VSwitchId = vswitchId
+	response, err := client.DeleteVSwitch(request)
+	assertErrorNil(t, err, "Failed to delete vswitch instance")
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	fmt.Printf("success(%d)!\n", response.GetHttpStatus())
+	return
+}
+
+func deleteVpcInstance(t *testing.T, client *vpc.Client, vpcId string){
+	fmt.Printf("deleting vpc instance(%s)...", vpcId)
+	request := vpc.CreateDeleteVpcRequest()
+	request.VpcId = vpcId
+	response, err := client.DeleteVpc(request)
+	assertErrorNil(t, err, "Failed to delete vpc instance")
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	fmt.Printf("success(%d)!\n", response.GetHttpStatus())
+	return
+}

+ 6 - 3
sdk/errors/client_error.go

@@ -37,6 +37,9 @@ const (
 
 	MissingParamCode = "SDK.MissingParam"
 	InvalidParamCode = "SDK.InvalidParam"
+
+	JsonUnmarshalCode = "SDK.JsonUnmarshalError"
+	JsonUnmarshalMessage = "Failed to unmarshal response, but you can get the data via response.GetHttpStatusCode() and response.GetHttpContentString()"
 )
 
 type ClientError struct {
@@ -54,11 +57,11 @@ func NewClientError(errorCode, message string, originErr error) Error {
 }
 
 func (err *ClientError) Error() string {
+	clientErrMsg := fmt.Sprintf("[%s] %s", err.errorCode, err.message)
 	if err.originError != nil {
-		return err.originError.Error()
+		return clientErrMsg + "\noriginal error:\n" + err.originError.Error()
 	}
-
-	return fmt.Sprintf("[%s] %s", err.errorCode, err.message)
+	return clientErrMsg
 }
 
 func (err *ClientError) OriginError() error {

+ 0 - 11
sdk/responses/json_parser_test.go

@@ -50,17 +50,6 @@ func TestFuzzyFieldUnmarshal(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}]"
-//	commonResponse := NewCommonResponse()
-//	// support auto json type trans
-//	initJsonParserOnce()
-//	err := jsonParser.Unmarshal([]byte(arrayJson), commonResponse)
-//	if err != nil {
-//		panic(err)
-//	}
-//}
-
 func getJsonBytes() ([]byte, error) {
 	from := &From{
 		StrToStr:            "demo string",

+ 7 - 0
sdk/responses/response.go

@@ -43,9 +43,16 @@ func Unmarshal(response AcsResponse, httpResponse *http.Response, format string)
 		err = errors.NewServerError(response.GetHttpStatus(), response.GetOriginHttpResponse().Status, response.GetHttpContentString())
 		return
 	}
+	if _, isCommonResponse := response.(CommonResponse); isCommonResponse {
+		// common response need not unmarshal
+		return
+	}
 	if strings.ToUpper(format) == "JSON" {
 		initJsonParserOnce()
 		err = jsonParser.Unmarshal(response.GetHttpContentBytes(), response)
+		if err != nil {
+			err = errors.NewClientError(errors.JsonUnmarshalCode, errors.JsonUnmarshalMessage, err)
+		}
 	} else if strings.ToUpper(format) == "XML" {
 		err = xml.Unmarshal(response.GetHttpContentBytes(), response)
 	}