| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- 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)
- }
- }
|