Download the Go SDK

Sample code

const.go:

package eci

type ContainerGroupStatus string

const (
	Scheduling     = ContainerGroupStatus("Scheduling")
	Pending        = ContainerGroupStatus("Pending")
	Running        = ContainerGroupStatus("Running")
	Succeeded      = ContainerGroupStatus("Succeeded")
	Failed         = ContainerGroupStatus("Failed")
	Restarting     = ContainerGroupStatus("Restarting")
	Updating       = ContainerGroupStatus("Updating")
	ScheduleFailed = ContainerGroupStatus("ScheduleFailed")
)

type ContainerStatus string

const (
	waiting    = ContainerStatus("Waiting")
	running    = ContainerStatus("Running")
	terminated = ContainerStatus("Terminated")
)

config.conf:

[eci_conf]
# The AccessKey pair of the test account.
access_key = xxx
secret_key = xxx

#region
region_id=cn-hangzhou

# The information about the resources in each region, in JSON format.
region_info={"cn-hangzhou": {"securityGroupId": "sg-bp118knl07ymorgzfhyw","vSwitchId": "vsw-bp1jrgfqqy54kg5hcf8bc","zoneId": "cn-hangzhou-h"},"cn-shanghai": {"securityGroupId": "sg-uf62jug0dt92nfy630cs","vSwitchId": "vsw-uf6cb39ub5urw82bv3w70","zoneId": "cn-shanghai-g"},"cn-beijing": {"securityGroupId": "sg-2ze6uv80a8s4yk04dmyu","vSwitchId": "vsw-2zegtxf8q29d8tt1xtcjk","zoneId": "cn-beijing-h"},"cn-shenzhen":{"securityGroupId": "sg-wz96x4kv4edy97q6jjzn","vSwitchId": "vsw-wz9rn33jwilodp24klo0q","zoneId": "cn-shenzhen-a"},"cn-hongkong":{"securityGroupId": "sg-j6cjajpf7f4ybda7h19w","vSwitchId": "vsw-j6c9c9fit5owbbc0ids6c","zoneId": "cn-hongkong-b"},"us-west-1":{"securityGroupId": "sg-u19hbpj9x","vSwitchId": "vsw-rj9h5vvzhb4fjkuzuyi8j","zoneId": "us-west-1a"},"us-east-1":{"securityGroupId": "sg-0xih51sfoldxzxfsbja5","vSwitchId": "vsw-0xisefewxoqe4f849jbnl","zoneId": "us-east-1b"},"ap-southeast-1":{"securityGroupId": "sg-t4n23ppw7fm5to7cnib9","vSwitchId": "vsw-t4nr1xt8zupxg00unnmg9","zoneId": "ap-southeast-1b"},"cn-zhangjiakou": {"securityGroupId": "sg-8vb96lku1dgq71ckh98g","vSwitchId": "vsw-8vbtnz5878r3bcio7cpyx", "nfs":"9cbb94a474-oav34.cn-zhangjiakou.nas.aliyuncs.com", "zoneId": "cn-zhangjiakou-a"}}

The following code displays the region_info parameter in an easy-to-read format. Note that the settings are for reference only.

{
    "cn-hangzhou": {
        "securityGroupId": "sg-bp118knl07ymorgzfhyw",
        "vSwitchId": "vsw-bp1jrgfqqy54kg5hcf8bc",
        "zoneId": "cn-hangzhou-h"
    },
    "cn-shanghai": {
        "securityGroupId": "sg-uf62jug0dt92nfy630cs",
        "vSwitchId": "vsw-uf6cb39ub5urw82bv3w70",
        "zoneId": "cn-shanghai-g"
    },
    "cn-beijing": {
        "securityGroupId": "sg-2ze6uv80a8s4yk04dmyu",
        "vSwitchId": "vsw-2zegtxf8q29d8tt1xtcjk",
        "zoneId": "cn-beijing-h"
    },
    "cn-shenzhen": {
        "securityGroupId": "sg-wz96x4kv4edy97q6jjzn",
        "vSwitchId": "vsw-wz9rn33jwilodp24klo0q",
        "zoneId": "cn-shenzhen-a"
    },
    "cn-hongkong": {
        "securityGroupId": "sg-j6cjajpf7f4ybda7h19w",
        "vSwitchId": "vsw-j6c9c9fit5owbbc0ids6c",
        "zoneId": "cn-hongkong-b"
    },
    "us-west-1": {
        "securityGroupId": "sg-u19hbpj9x",
        "vSwitchId": "vsw-rj9h5vvzhb4fjkuzuyi8j",
        "zoneId": "us-west-1a"
    },
    "ap-southeast-1": {
        "securityGroupId": "sg-t4n23ppw7fm5to7cnib9",
        "vSwitchId": "vsw-t4nr1xt8zupxg00unnmg9",
        "zoneId": "ap-southeast-1b"
    },
    "cn-zhangjiakou": {
        "securityGroupId": "sg-8vb96lku1dgq71ckh98g",
        "vSwitchId": "vsw-8vbtnz5878r3bcio7cpyx",
        "zoneId": "cn-zhangjiakou-a"
    }
}

eci.go:

package eci

import (
	"encoding/json"
	"fmt"
	"github.com/Unknwon/goconfig"
	"github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
	"github.com/aliyun/alibaba-cloud-sdk-go/services/eci"
	"math"
	"os"
	"reflect"
	"strconv"
	"time"
)

var accessKey string
var secretKey string
var regionId string
var zoneId string
var securityGroupId string
var vSwitchId string

var client *eci.Client

/**
Obtain the configurations.
 */
func init() {
	var cfg *goconfig.ConfigFile
	config, err := goconfig.LoadConfigFile("./eci/config.conf") // Load the configuration file.
	if err ! = nil {
		fmt.Println("get config file error:", err.Error())
		os.Exit(-1)
	}
	cfg = config

	accessKey, _ = cfg.GetValue("eci_conf", "access_key")
	secretKey, _ = cfg.GetValue("eci_conf", "secret_key")
	regionId, _ = cfg.GetValue("eci_conf", "region_id")

	var regionInfo map[string](map[string](string));
	value, _ := cfg.GetValue("eci_conf", "region_info")

	json.Unmarshal([]byte(value), &regionInfo)

	zoneId = regionInfo[regionId]["zoneId"]
	securityGroupId = regionInfo[regionId]["securityGroupId"]
	vSwitchId = regionInfo[regionId]["vSwitchId"]

	fmt.Printf("init success[ access_key:%s, secret_key:%s, region_id:%s, zoneId:%s, vSwitchId:%s, securityGroupId:%s]\n",
		accessKey, secretKey, regionId, zoneId, vSwitchId, securityGroupId)
    
    // Initialize the client.
    client, err = eci.NewClientWithAccessKey(regionId, accessKey, secretKey)
	if err ! = nil {
		panic(err)
	}
}

/**
Create a container group.
*/
func createContainerGroup ()(string)  {
	// Create Container Group
	createContainerRequest := eci.CreateCreateContainerGroupRequest()
	// required
	createContainerRequest.RegionId = regionId;
	createContainerRequest.SecurityGroupId = securityGroupId
	createContainerRequest.VSwitchId = vSwitchId
	createContainerRequest.ContainerGroupName = "test-go-sdk"
	createContainerRequest.RestartPolicy = "Never"
	
	createContainerRequestVolume := make([]eci.CreateContainerGroupVolume, 1)
	
	volume1 := &eci.CreateContainerGroupNFSVolume{
		Path:"/",
		Server:"0a1bf4a604-jaq68.cn-hangzhou.nas.aliyuncs.com",
	}

	createContainerRequestVolume[0].Name = "volume1"
	createContainerRequestVolume[0].Type ="NFSVolume"
	createContainerRequestVolume[0].NFSVolume=*volume1
	
	createContainerRequest.Volume = &createContainerRequestVolume

	createContainerRequestContainer := make([]eci.CreateContainerGroupContainer, 1)
	createContainerRequestContainer[0].Image = "nginx"
	createContainerRequestContainer[0].Name = "nginx-liu"
	// option
	createContainerRequestContainer[0].Cpu = requests.NewFloat(0.25)
	createContainerRequestContainer[0].Memory = requests.NewFloat(0.5)
	createContainerRequestContainer[0].ImagePullPolicy = "IfNotPresent"

	createContainerRequest.Container = &createContainerRequestContainer

	// The default number of retries of sdk-core is 3. Without the settings to ensure idempotence, the underlying operation does not need to automatically retry to create resources.
	client.GetConfig().MaxRetryTime = 0
	createContainerGroupResponse, err := client.CreateContainerGroup(createContainerRequest)
	if err ! = nil {
		panic(err)
	}

	containerGroupId := createContainerGroupResponse.ContainerGroupId

	fmt.Println(containerGroupId)

	return containerGroupId

}

/**
Delete a container group.
*/
func deleteContainerGroup(containerGroupId string) {
	deleteContainerGroupRequest := eci.CreateDeleteContainerGroupRequest()
	deleteContainerGroupRequest.RegionId = regionId
	deleteContainerGroupRequest.ContainerGroupId = containerGroupId

    _, err := client.DeleteContainerGroup(deleteContainerGroupRequest)
	if err ! = nil {
		panic(err)
	}

	fmt.Println("DeleteContainerGroup ContainerGroupId :", containerGroupId)
}

/**
Query a container group.
*/
func describeContainerGroup(containerGroupId string) (eci.DescribeContainerGroupsContainerGroup0)  {
	// Describe Container Groups
	describeContainerGroupsRequest := eci.CreateDescribeContainerGroupsRequest()
	describeContainerGroupsRequest.RegionId = regionId

	containerGroupIds := append([]string{}, containerGroupId)
	containerGroupIdsString, err := json.Marshal(containerGroupIds)
	describeContainerGroupsRequest.ContainerGroupIds = string(containerGroupIdsString)

	describeContainerGroupsResponse, err := client.DescribeContainerGroups(describeContainerGroupsRequest)
	if err ! = nil {
		panic(err)
	}

	describeContainerGroupNumber := len(describeContainerGroupsResponse.ContainerGroups)

	if describeContainerGroupsResponse.TotalCount ! = 1 && describeContainerGroupNumber ! = 1 {
		fmt.Println("Invalid ContainerGroups count", describeContainerGroupsResponse.TotalCount, describeContainerGroupNumber)
		panic("Invalid ContainerGroups count")
	}

	fmt.Println("ContainerGroup status:", describeContainerGroupsResponse.ContainerGroups[0].Status, containerGroupId,)

	// container groups
	return describeContainerGroupsResponse.ContainerGroups[0]

}

func describeContainerGroupMetric(containerGroupId string)  {
	describeContainerGroupMetricRequest :=eci.CreateDescribeContainerGroupMetricRequest()
	describeContainerGroupMetricRequest.RegionId = regionId
	describeContainerGroupMetricRequest.ContainerGroupId=containerGroupId

	response, err := client.DescribeContainerGroupMetric(describeContainerGroupMetricRequest)
	if err ! = nil {
		panic(err)
	}

	data, _ :=json.Marshal(response)

	fmt.Printf("Metrics for %s:%s\n", containerGroupId, string(data))
}

func describeMultiContainerGroupMetric(containerGroupIds []string)  {
	describeContainerGroupMetricRequest
    :=eci.CreateDescribeMultiContainerGroupMetricRequest()
	describeContainerGroupMetricRequest.RegionId = regionId

	data,_ :=json.Marshal(containerGroupIds)
	describeContainerGroupMetricRequest.ContainerGroupIds=string(data)

	response, err := client.DescribeMultiContainerGroupMetric(describeContainerGroupMetricRequest)
	if err ! = nil {
		panic(err)
	}

	data, _ = json.Marshal(response)

	fmt.Printf("Metrics:%s\n", string(data))

}

func Test() {
	containerGroupIds := make(chan string)

	go func() {
		for i := 0; i < 1; i++ {
			containerGroupId := createContainerGroup()
			containerGroupIds <- containerGroupId
		}
	}()

	go func() {
		for containerGroupId := range containerGroupIds {
			for i := 0; i < 10; i++ {
				status := describeContainerGroup(containerGroupId).Status
				if Running == ContainerGroupStatus(status) {
					break
				} else {
					time.Sleep(5 * time.Second)
				}
			}
			//deleteContainerGroupById(containerGroupId)
		}
	}()

	// Block the program until the asynchronous operation is completed. Otherwise, the program exits before the operation is completed.
	var input string
	fmt.Println("waiting for input to finish:")
	fmt.Scanln(&input)
	fmt.Println("test done!")
}

main.go:

func main() {
	eci.Test()
}