Browse Source

Merge pull request #22 from aliyun/test

Add ecs integration test
gaort 8 năm trước cách đây
mục cha
commit
1d757c22fb
5 tập tin đã thay đổi với 194 bổ sung6 xóa
  1. 4 5
      .travis.yml
  2. 9 0
      ChangeLog.txt
  3. 1 1
      README.md
  4. 150 0
      integration/ecs_test.go
  5. 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  -timeout 20m ./integration/...

+ 9 - 0
ChangeLog.txt

@@ -1,6 +1,15 @@
+2018-01-04 Version: 0.7.4
+1, Add integration tests
+
 2018-01-04 Version: 0.7.3
 1, Remove get entity info API, replaced by get entity instance.
 
+2018-01-03 Version: 0.7.2
+1, Bug fix: fix the ecs unmarshal bug
+
+2018-01-03 Version: 0.7.1
+1, Bug fix: fix the unmarshal bug
+
 2017-12-29 Version: 0.7.0
 1, First release for Domain-intl.
 2, Add interfaces for domain name registration and management.

+ 1 - 1
README.md

@@ -24,7 +24,7 @@ go get -u github.com/aliyun/alibaba-cloud-sdk-go/sdk
 glide get github.com/aliyun/alibaba-cloud-sdk-go
 ```
 
-另外,阿里云Java SDK也会发布在 https://develop.aliyun.com/tools/sdk#/go 这个地址。
+另外,阿里云Go SDK也会发布在 https://develop.aliyun.com/tools/sdk#/go 这个地址。
 
 ## 开始调用
 以下这个代码示例向您展示了调用阿里云GO SDK的3个主要步骤:

+ 150 - 0
integration/ecs_test.go

@@ -0,0 +1,150 @@
+package integration
+
+import (
+	"fmt"
+	"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
+	"github.com/stretchr/testify/assert"
+	"os"
+	"testing"
+	"time"
+)
+
+const (
+	InstanceDefaultTimeout = 120
+	DefaultWaitForInterval = 10
+
+	Running = "Running"
+	Stopped = "Stopped"
+	Deleted = "Deleted"
+)
+
+// 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, 600)
+}
+
+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!")
+}
+
+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)
+	}
+}

+ 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
+	}
+}