浏览代码

add intergration tests

Signed-off-by: 高汝彤 <rutong.grt@alibaba-inc.com>
高汝彤 8 年之前
父节点
当前提交
a5cab31347
共有 3 个文件被更改,包括 205 次插入5 次删除
  1. 4 5
      .travis.yml
  2. 171 0
      integration/ecs_test.go
  3. 30 0
      integration/utils.go

+ 4 - 5
.travis.yml

@@ -8,14 +8,13 @@ go:
   - 1.9.x
 
 install:
-#  - go get -u github.com/Masterminds/glide
-#  - glide install
-  - go get -u github.com/aliyun/alibaba-cloud-sdk-go/sdk
+  - go get -u github.com/Masterminds/glide
+  - glide install
 
 notifications:
     webhooks: https://oapi.dingtalk.com/robot/send?access_token=096ed387df243a6d60835aadeccc47165f3813bc7cb81cdd0cfeadfd28e3acc1
     email: false
-    on_success: always
+    on_success: change
     on_failure: always
 
 script:
@@ -23,4 +22,4 @@ script:
   - go vet ./services/...
   - go build ./sdk
   - go build ./services/...
-  - go test ./sdk/test/simple_test.go
+  - go test -v ./integration/...

+ 171 - 0
integration/ecs_test.go

@@ -0,0 +1,171 @@
+package integration
+
+import (
+	"testing"
+	"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
+	"fmt"
+	"time"
+	"os"
+	"github.com/stretchr/testify/assert"
+)
+
+const (
+	InstanceDefaultTimeout = 120
+	DefaultWaitForInterval = 10
+
+	Creating = "Creating"
+	Pending  = "Pending"
+	Running  = "Running"
+	Starting = "Starting"
+
+	Stopped  = "Stopped"
+	Stopping = "Stopping"
+	Deleted  = "Deleted"
+)
+
+//func TestSimple(t *testing.T) {
+//	config := getConfigFromEnv()
+//	ecsClient, err := ecs.NewClientWithAccessKey("cn-hangzhou", config.AccessKeyId, config.AccessKeySecret)
+//	if err != nil {
+//		panic(err)
+//	}
+//	request := ecs.CreateDescribeRegionsRequest()
+//	response, err := ecsClient.DescribeRegions(request)
+//	if err != nil {
+//		panic(err)
+//	}
+//	assert.Equal(t, 200, response.GetHttpStatus())
+//	fmt.Print(response.GetHttpContentString())
+//}
+
+func assertErrorNil(t *testing.T, err error, message string) {
+	if err != nil {
+		fmt.Fprintf(os.Stderr, message+": %v\n", err)
+	}
+}
+
+func waitForInstance(t *testing.T, client *ecs.Client, instanceId string, status string, timeout int) {
+	if timeout <= 0 {
+		timeout = InstanceDefaultTimeout
+	}
+	for {
+		request := ecs.CreateDescribeInstanceAttributeRequest()
+		request.InstanceId = instanceId
+		response, err := client.DescribeInstanceAttribute(request)
+		assertErrorNil(t, err, "Failed to create describe instance request\n")
+
+
+		if status == Deleted {
+			if response.GetHttpStatus() == 404 || response.Status == Deleted{
+				fmt.Printf("delete instance(%s) success\n", instanceId)
+				break
+			}
+		}else{
+			if response.Status == status {
+				fmt.Printf("instance(%s) status changed to %s, wait a moment\n", instanceId, status)
+				time.Sleep(DefaultWaitForInterval * time.Second)
+				break
+			}else{
+				fmt.Printf("instance(%s) status is %s, wait for changing to %s\n", instanceId, response.Status, status)
+			}
+		}
+
+		timeout = timeout - DefaultWaitForInterval
+		if timeout <= 0 {
+			t.Errorf(fmt.Sprintf("wait for instance(%s) status to %s timeout(%d)\n", instanceId, status, timeout))
+		}
+		time.Sleep(DefaultWaitForInterval * time.Second)
+	}
+}
+
+// create -> start -> stop -> delete
+func TestEcsInstance(t *testing.T) {
+
+	// init client
+	config := getConfigFromEnv()
+	ecsClient, err := ecs.NewClientWithAccessKey("cn-hangzhou", config.AccessKeyId, config.AccessKeySecret)
+	assertErrorNil(t, err, "Failed to init client")
+	fmt.Printf("Init client success\n")
+
+	// get demo instance attributes
+	param := getDemoInstanceAttributes(t, ecsClient)
+
+	// create
+	instanceId := createInstance(t, ecsClient, param)
+
+	// defer wait for deleted
+	defer waitForInstance(t, ecsClient, instanceId, Deleted, 120)
+
+	// defer delete
+	defer deleteInstance(t, ecsClient, instanceId)
+
+	// wait
+	waitForInstance(t, ecsClient, instanceId, Stopped, 60)
+
+	// start
+	startInstance(t, ecsClient, instanceId)
+
+	// wait
+	waitForInstance(t, ecsClient, instanceId, Running, 120)
+
+	// stop
+	stopInstance(t, ecsClient, instanceId)
+
+	// wait
+	waitForInstance(t, ecsClient, instanceId, Stopped, 120)
+}
+
+func getDemoInstanceAttributes(t *testing.T, client *ecs.Client) *ecs.DescribeInstanceAttributeResponse {
+	fmt.Print("trying to get demo instance...")
+	request := ecs.CreateDescribeInstanceAttributeRequest()
+	request.InstanceId = os.Getenv("DEMO_ECS_INSTANCE_ID")
+	response, err := client.DescribeInstanceAttribute(request)
+	assertErrorNil(t, err, "Failed to get demo instance attributes")
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	fmt.Println("success!")
+	return response
+}
+
+func createInstance(t *testing.T, client *ecs.Client, param *ecs.DescribeInstanceAttributeResponse)(instanceId string){
+	fmt.Print("creating instance...")
+	request := ecs.CreateCreateInstanceRequest()
+	request.ImageId = param.ImageId
+	request.SecurityGroupId = param.SecurityGroupIds.SecurityGroupId[0]
+	request.InstanceType = "ecs.t1.small"
+	response, err := client.CreateInstance(request)
+	assertErrorNil(t, err, "Failed to create instance")
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	instanceId = response.InstanceId
+	fmt.Printf("success(%d)! instanceId = %s\n", response.GetHttpStatus(), instanceId)
+	return
+}
+
+func startInstance(t *testing.T, client *ecs.Client, instanceId string){
+	fmt.Printf("starting instance(%s)...", instanceId)
+	request := ecs.CreateStartInstanceRequest()
+	request.InstanceId = instanceId
+	response, err := client.StartInstance(request)
+	assertErrorNil(t, err, "Failed to start instance " + instanceId)
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	fmt.Println("success!")
+}
+
+func stopInstance(t *testing.T, client *ecs.Client, instanceId string){
+	fmt.Printf("stopping instance(%s)...", instanceId)
+	request := ecs.CreateStopInstanceRequest()
+	request.InstanceId = instanceId
+	response, err := client.StopInstance(request)
+	assertErrorNil(t, err, "Failed to stop instance " + instanceId)
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	fmt.Println("success!")
+}
+
+func deleteInstance(t *testing.T, client *ecs.Client, instanceId string){
+	fmt.Printf("deleting instance(%s)...", instanceId)
+	request := ecs.CreateDeleteInstanceRequest()
+	request.InstanceId = instanceId
+	response, err := client.DeleteInstance(request)
+	assertErrorNil(t, err, "Failed to delete instance " + instanceId)
+	assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
+	fmt.Println("success!")
+}

+ 30 - 0
integration/utils.go

@@ -0,0 +1,30 @@
+package integration
+
+import "os"
+
+type Config struct {
+	AccessKeyId     string
+	AccessKeySecret string
+	PublicKeyId     string
+	PrivateKey      string
+	RoleArn         string
+	ChildAK         string
+	ChildSecret     string
+}
+
+func getConfigFromEnv() *Config {
+	config := &Config{
+		AccessKeyId:     os.Getenv("ACCESS_KEY_ID"),
+		AccessKeySecret: os.Getenv("ACCESS_KEY_SECRET"),
+		PublicKeyId:     os.Getenv("PUBLIC_KEY_ID"),
+		PrivateKey:      os.Getenv("PRIVATE_KEY"),
+		RoleArn:         os.Getenv("ROLE_ARN"),
+		ChildAK:         os.Getenv("CHILD_AK"),
+		ChildSecret:     os.Getenv("CHILD_SECRET"),
+	}
+	if config.AccessKeyId == "" {
+		return nil
+	} else {
+		return config
+	}
+}