summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/goamz/goamz/ecs
diff options
context:
space:
mode:
authorChristopher Speller <crspeller@gmail.com>2016-05-12 23:56:07 -0400
committerChristopher Speller <crspeller@gmail.com>2016-05-12 23:56:07 -0400
commit38ee83e45b4de7edf89bf9f0ef629eb4c6ad0fa8 (patch)
treea4fde09672192b97d453ad605b030bd5a10c5a45 /vendor/github.com/goamz/goamz/ecs
parent84d2482ddbff9564c9ad75b2d30af66e3ddfd44d (diff)
downloadchat-38ee83e45b4de7edf89bf9f0ef629eb4c6ad0fa8.tar.gz
chat-38ee83e45b4de7edf89bf9f0ef629eb4c6ad0fa8.tar.bz2
chat-38ee83e45b4de7edf89bf9f0ef629eb4c6ad0fa8.zip
Moving to glide
Diffstat (limited to 'vendor/github.com/goamz/goamz/ecs')
-rw-r--r--vendor/github.com/goamz/goamz/ecs/ecs.go1075
-rw-r--r--vendor/github.com/goamz/goamz/ecs/ecs_test.go806
-rw-r--r--vendor/github.com/goamz/goamz/ecs/responses_test.go637
3 files changed, 2518 insertions, 0 deletions
diff --git a/vendor/github.com/goamz/goamz/ecs/ecs.go b/vendor/github.com/goamz/goamz/ecs/ecs.go
new file mode 100644
index 000000000..89c7243d4
--- /dev/null
+++ b/vendor/github.com/goamz/goamz/ecs/ecs.go
@@ -0,0 +1,1075 @@
+//
+// ecs: This package provides types and functions to interact with the AWS EC2 Container Service API
+//
+// Depends on https://github.com/goamz/goamz
+//
+// Author Boyan Dimitrov <boyann@gmail.com>
+//
+
+package ecs
+
+import (
+ "encoding/xml"
+ "fmt"
+ "log"
+ "net/http"
+ "net/http/httputil"
+ "net/url"
+ "strconv"
+ "strings"
+ "time"
+
+ "github.com/goamz/goamz/aws"
+)
+
+const debug = false
+
+var timeNow = time.Now
+
+// ECS contains the details of the AWS region to perform operations against.
+type ECS struct {
+ aws.Auth
+ aws.Region
+}
+
+// New creates a new ECS Client.
+func New(auth aws.Auth, region aws.Region) *ECS {
+ return &ECS{auth, region}
+}
+
+// ----------------------------------------------------------------------------
+// Request dispatching logic.
+
+// Error encapsulates an error returned by the AWS ECS API.
+//
+// See http://goo.gl/VZGuC for more details.
+type Error struct {
+ // HTTP status code (200, 403, ...)
+ StatusCode int
+ // ECS error code ("UnsupportedOperation", ...)
+ Code string
+ // The error type
+ Type string
+ // The human-oriented error message
+ Message string
+ RequestId string `xml:"RequestID"`
+}
+
+func (err *Error) Error() string {
+ if err.Code == "" {
+ return err.Message
+ }
+
+ return fmt.Sprintf("%s (%s)", err.Message, err.Code)
+}
+
+type xmlErrors struct {
+ RequestId string `xml:"RequestId"`
+ Errors []Error `xml:"Error"`
+}
+
+func (e *ECS) query(params map[string]string, resp interface{}) error {
+ params["Version"] = "2014-11-13"
+ data := strings.NewReader(multimap(params).Encode())
+
+ hreq, err := http.NewRequest("POST", e.Region.ECSEndpoint+"/", data)
+ if err != nil {
+ return err
+ }
+
+ hreq.Header.Set("Content-Type", "application/x-www-form-urlencoded; param=value")
+
+ token := e.Auth.Token()
+ if token != "" {
+ hreq.Header.Set("X-Amz-Security-Token", token)
+ }
+
+ signer := aws.NewV4Signer(e.Auth, "ecs", e.Region)
+ signer.Sign(hreq)
+
+ if debug {
+ log.Printf("%v -> {\n", hreq)
+ }
+ r, err := http.DefaultClient.Do(hreq)
+
+ if err != nil {
+ log.Printf("Error calling Amazon %v", err)
+ return err
+ }
+
+ defer r.Body.Close()
+
+ if debug {
+ dump, _ := httputil.DumpResponse(r, true)
+ log.Printf("response:\n")
+ log.Printf("%v\n}\n", string(dump))
+ }
+ if r.StatusCode != 200 {
+ return buildError(r)
+ }
+ err = xml.NewDecoder(r.Body).Decode(resp)
+ return err
+}
+
+func buildError(r *http.Response) error {
+ var (
+ err Error
+ errors xmlErrors
+ )
+ xml.NewDecoder(r.Body).Decode(&errors)
+ if len(errors.Errors) > 0 {
+ err = errors.Errors[0]
+ }
+
+ err.RequestId = errors.RequestId
+ err.StatusCode = r.StatusCode
+ if err.Message == "" {
+ err.Message = r.Status
+ }
+ return &err
+}
+
+func multimap(p map[string]string) url.Values {
+ q := make(url.Values, len(p))
+ for k, v := range p {
+ q[k] = []string{v}
+ }
+ return q
+}
+
+func makeParams(action string) map[string]string {
+ params := make(map[string]string)
+ params["Action"] = action
+ return params
+}
+
+func addParamsList(params map[string]string, label string, ids []string) {
+ for i, id := range ids {
+ params[label+"."+strconv.Itoa(i+1)] = id
+ }
+}
+
+// ----------------------------------------------------------------------------
+// ECS types and related functions.
+
+// SimpleResp is the beic response from most actions.
+type SimpleResp struct {
+ XMLName xml.Name
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// Cluster encapsulates the cluster datatype
+//
+// See
+type Cluster struct {
+ ClusterArn string `xml:"clusterArn"`
+ ClusterName string `xml:"clusterName"`
+ Status string `xml:"status"`
+}
+
+// CreateClusterReq encapsulates the createcluster req params
+type CreateClusterReq struct {
+ ClusterName string
+}
+
+// CreateClusterResp encapsulates the createcluster response
+type CreateClusterResp struct {
+ Cluster Cluster `xml:"CreateClusterResult>cluster"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// CreateCluster creates a new Amazon ECS cluster. By default, your account
+// will receive a default cluster when you launch your first container instance
+func (e *ECS) CreateCluster(req *CreateClusterReq) (resp *CreateClusterResp, err error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("CreateCluster")
+ params["clusterName"] = req.ClusterName
+
+ resp = new(CreateClusterResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// Resource describes the resources available for a container instance.
+type Resource struct {
+ DoubleValue float64 `xml:"doubleValue"`
+ IntegerValue int32 `xml:"integerValue"`
+ LongValue int64 `xml:"longValue"`
+ Name string `xml:"name"`
+ StringSetValue []string `xml:"stringSetValue>member"`
+ Type string `xml:"type"`
+}
+
+// ContainerInstance represents n Amazon EC2 instance that is running
+// the Amazon ECS agent and has been registered with a cluster
+type ContainerInstance struct {
+ AgentConnected bool `xml:"agentConnected"`
+ ContainerInstanceArn string `xml:"containerInstanceArn"`
+ Ec2InstanceId string `xml:"ec2InstanceId"`
+ RegisteredResources []Resource `xml:"registeredResources>member"`
+ RemainingResources []Resource `xml:"remainingResources>member"`
+ Status string `xml:"status"`
+}
+
+// DeregisterContainerInstanceReq encapsulates DeregisterContainerInstance request params
+type DeregisterContainerInstanceReq struct {
+ Cluster string
+ // arn:aws:ecs:region:aws_account_id:container-instance/container_instance_UUID.
+ ContainerInstance string
+ Force bool
+}
+
+// DeregisterContainerInstanceResp encapsulates DeregisterContainerInstance response
+type DeregisterContainerInstanceResp struct {
+ ContainerInstance ContainerInstance `xml:"DeregisterContainerInstanceResult>containerInstance"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DeregisterContainerInstance deregisters an Amazon ECS container instance from the specified cluster
+func (e *ECS) DeregisterContainerInstance(req *DeregisterContainerInstanceReq) (
+ resp *DeregisterContainerInstanceResp, err error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("DeregisterContainerInstance")
+ params["containerInstance"] = req.ContainerInstance
+ params["force"] = strconv.FormatBool(req.Force)
+
+ if req.Cluster != "" {
+ params["cluster"] = req.Cluster
+ }
+
+ resp = new(DeregisterContainerInstanceResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// PortMapping encapsulates the PortMapping data type
+type PortMapping struct {
+ ContainerPort int32 `xml:containerPort`
+ HostPort int32 `xml:hostPort`
+}
+
+// KeyValuePair encapsulates the KeyValuePair data type
+type KeyValuePair struct {
+ Name string `xml:"name"`
+ Value string `xml:"value"`
+}
+
+// MountPoint encapsulates the MountPoint data type
+type MountPoint struct {
+ ContainerPath string `xml:"containerPath"`
+ ReadOnly bool `xml:"readOnly"`
+ SourceVolume string `xml:"sourceVolume"`
+}
+
+// VolumeFrom encapsulates the VolumeFrom data type
+type VolumeFrom struct {
+ ReadOnly bool `xml:"readOnly"`
+ SourceContainer string `xml:"sourceContainer"`
+}
+
+// HostVolumeProperties encapsulates the HostVolumeProperties data type
+type HostVolumeProperties struct {
+ SourcePath string `xml:"sourcePath"`
+}
+
+// Volume encapsulates the Volume data type
+type Volume struct {
+ Host HostVolumeProperties `xml:"host"`
+ Name string `xml:"name"`
+}
+
+// ContainerDefinition encapsulates the container definition type
+// Container definitions are used in task definitions to describe
+// the different containers that are launched as part of a task
+type ContainerDefinition struct {
+ Command []string `xml:"command>member"`
+ Cpu int32 `xml:"cpu"`
+ EntryPoint []string `xml:"entryPoint>member"`
+ Environment []KeyValuePair `xml:"environment>member"`
+ Essential bool `xml:"essential"`
+ Image string `xml:"image"`
+ Links []string `xml:"links>member"`
+ Memory int32 `xml:"memory"`
+ MountPoints []MountPoint `xml:"mountPoints>member"`
+ Name string `xml:"name"`
+ PortMappings []PortMapping `xml:"portMappings>member"`
+ VolumesFrom []VolumeFrom `xml:"volumesFrom>member"`
+}
+
+// TaskDefinition encapsulates the task definition type
+type TaskDefinition struct {
+ ContainerDefinitions []ContainerDefinition `xml:"containerDefinitions>member"`
+ Family string `xml:"family"`
+ Revision int32 `xml:"revision"`
+ TaskDefinitionArn string `xml:"taskDefinitionArn"`
+ Status string `xml:"status"`
+ Volumes []Volume `xml:"volumes>member"`
+}
+
+// DeregisterTaskDefinitionReq encapsulates DeregisterTaskDefinition req params
+type DeregisterTaskDefinitionReq struct {
+ TaskDefinition string
+}
+
+// DeregisterTaskDefinitionResp encapsuates the DeregisterTaskDefinition response
+type DeregisterTaskDefinitionResp struct {
+ TaskDefinition TaskDefinition `xml:"DeregisterTaskDefinitionResult>taskDefinition"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DeregisterTaskDefinition deregisters the specified task definition
+func (e *ECS) DeregisterTaskDefinition(req *DeregisterTaskDefinitionReq) (
+ *DeregisterTaskDefinitionResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("DeregisterTaskDefinition")
+ params["taskDefinition"] = req.TaskDefinition
+
+ resp := new(DeregisterTaskDefinitionResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// Failure encapsulates the failure type
+type Failure struct {
+ Arn string `xml:"arn"`
+ Reason string `xml:"reason"`
+}
+
+// DescribeClustersReq encapsulates DescribeClusters req params
+type DescribeClustersReq struct {
+ Clusters []string
+}
+
+// DescribeClustersResp encapsuates the DescribeClusters response
+type DescribeClustersResp struct {
+ Clusters []Cluster `xml:"DescribeClustersResult>clusters>member"`
+ Failures []Failure `xml:"DescribeClustersResult>failures>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeClusters describes one or more of your clusters
+func (e *ECS) DescribeClusters(req *DescribeClustersReq) (*DescribeClustersResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("DescribeClusters")
+ if len(req.Clusters) > 0 {
+ addParamsList(params, "clusters.member", req.Clusters)
+ }
+
+ resp := new(DescribeClustersResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DescribeContainerInstancesReq ecapsulates DescribeContainerInstances req params
+type DescribeContainerInstancesReq struct {
+ Cluster string
+ ContainerInstances []string
+}
+
+// DescribeContainerInstancesResp ecapsulates DescribeContainerInstances response
+type DescribeContainerInstancesResp struct {
+ ContainerInstances []ContainerInstance `xml:"DescribeContainerInstancesResult>containerInstances>member"`
+ Failures []Failure `xml:"DescribeContainerInstancesResult>failures>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeContainerInstances describes Amazon EC2 Container Service container instances
+// Returns metadata about registered and remaining resources on each container instance requested
+func (e *ECS) DescribeContainerInstances(req *DescribeContainerInstancesReq) (
+ *DescribeContainerInstancesResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("DescribeContainerInstances")
+ if req.Cluster != "" {
+ params["cluster"] = req.Cluster
+ }
+ if len(req.ContainerInstances) > 0 {
+ addParamsList(params, "containerInstances.member", req.ContainerInstances)
+ }
+
+ resp := new(DescribeContainerInstancesResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DescribeTaskDefinitionReq encapsulates DescribeTaskDefinition req params
+type DescribeTaskDefinitionReq struct {
+ TaskDefinition string
+}
+
+// DescribeTaskDefinitionResp encapsuates the DescribeTaskDefinition response
+type DescribeTaskDefinitionResp struct {
+ TaskDefinition TaskDefinition `xml:"DescribeTaskDefinitionResult>taskDefinition"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeTaskDefinition describes a task definition
+func (e *ECS) DescribeTaskDefinition(req *DescribeTaskDefinitionReq) (
+ *DescribeTaskDefinitionResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("DescribeTaskDefinition")
+ params["taskDefinition"] = req.TaskDefinition
+
+ resp := new(DescribeTaskDefinitionResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// NetworkBinding encapsulates the network binding data type
+type NetworkBinding struct {
+ BindIp string `xml:"bindIp"`
+ ContainerPort int32 `xml:"containerPort"`
+ HostPort int32 `xml:"hostPort"`
+}
+
+// Container encapsulates the container data type
+type Container struct {
+ ContainerArn string `xml:"containerArn"`
+ ExitCode int32 `xml:"exitCode"`
+ LastStatus string `xml:"lastStatus"`
+ Name string `xml:"name"`
+ NetworkBindings []NetworkBinding `xml:"networkBindings>member"`
+ Reason string `xml:"reason"`
+ TaskArn string `xml:"taskArn"`
+}
+
+// ContainerOverride encapsulates the container override data type
+type ContainerOverride struct {
+ Command []string `xml:"command>member"`
+ Environment []KeyValuePair `xml:"environment>member"`
+ Name string `xml:"name"`
+}
+
+// TaskOverride encapsulates the task override data type
+type TaskOverride struct {
+ ContainerOverrides []ContainerOverride `xml:"containerOverrides>member"`
+}
+
+// Task encapsulates the task data type
+type Task struct {
+ ClusterArn string `xml:"clusterArn"`
+ ContainerInstanceArn string `xml:"containerInstanceArn"`
+ Containers []Container `xml:"containers>member"`
+ DesiredStatus string `xml:"desiredStatus"`
+ LastStatus string `xml:"lastStatus"`
+ Overrides TaskOverride `xml:"overrides"`
+ TaskArn string `xml:"taskArn"`
+ TaskDefinitionArn string `xml:"taskDefinitionArn"`
+}
+
+// DescribeTasksReq encapsulates DescribeTasks req params
+type DescribeTasksReq struct {
+ Cluster string
+ Tasks []string
+}
+
+// DescribeTasksResp encapsuates the DescribeTasks response
+type DescribeTasksResp struct {
+ Tasks []Task `xml:"DescribeTasksResult>tasks>member"`
+ Failures []Failure `xml:"DescribeTasksResult>failures>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DescribeTasks describes a task definition
+func (e *ECS) DescribeTasks(req *DescribeTasksReq) (*DescribeTasksResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("DescribeTasks")
+ if len(req.Tasks) > 0 {
+ addParamsList(params, "tasks.member", req.Tasks)
+ }
+ if req.Cluster != "" {
+ params["cluster"] = req.Cluster
+ }
+
+ resp := new(DescribeTasksResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// DiscoverPollEndpointReq encapsulates DiscoverPollEndpoint req params
+type DiscoverPollEndpointReq struct {
+ ContainerInstance string
+}
+
+// DiscoverPollEndpointResp encapsuates the DiscoverPollEndpoint response
+type DiscoverPollEndpointResp struct {
+ Endpoint string `xml:"DiscoverPollEndpointResult>endpoint"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// DiscoverPollEndpoint returns an endpoint for the Amazon EC2 Container Service agent
+// to poll for updates
+func (e *ECS) DiscoverPollEndpoint(req *DiscoverPollEndpointReq) (
+ *DiscoverPollEndpointResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("DiscoverPollEndpoint")
+ if req.ContainerInstance != "" {
+ params["containerInstance"] = req.ContainerInstance
+ }
+
+ resp := new(DiscoverPollEndpointResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// ListClustersReq encapsulates ListClusters req params
+type ListClustersReq struct {
+ MaxResults int32
+ NextToken string
+}
+
+// ListClustersResp encapsuates the ListClusters response
+type ListClustersResp struct {
+ ClusterArns []string `xml:"ListClustersResult>clusterArns>member"`
+ NextToken string `xml:"ListClustersResult>nextToken"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// ListClusters returns a list of existing clusters
+func (e *ECS) ListClusters(req *ListClustersReq) (
+ *ListClustersResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("ListClusters")
+ if req.MaxResults > 0 {
+ params["maxResults"] = strconv.Itoa(int(req.MaxResults))
+ }
+ if req.NextToken != "" {
+ params["nextToken"] = req.NextToken
+ }
+
+ resp := new(ListClustersResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// ListContainerInstancesReq encapsulates ListContainerInstances req params
+type ListContainerInstancesReq struct {
+ Cluster string
+ MaxResults int32
+ NextToken string
+}
+
+// ListContainerInstancesResp encapsuates the ListContainerInstances response
+type ListContainerInstancesResp struct {
+ ContainerInstanceArns []string `xml:"ListContainerInstancesResult>containerInstanceArns>member"`
+ NextToken string `xml:"ListContainerInstancesResult>nextToken"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// ListContainerInstances returns a list of container instances in a specified cluster.
+func (e *ECS) ListContainerInstances(req *ListContainerInstancesReq) (
+ *ListContainerInstancesResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("ListContainerInstances")
+ if req.MaxResults > 0 {
+ params["maxResults"] = strconv.Itoa(int(req.MaxResults))
+ }
+ if req.Cluster != "" {
+ params["cluster"] = req.Cluster
+ }
+ if req.NextToken != "" {
+ params["nextToken"] = req.NextToken
+ }
+
+ resp := new(ListContainerInstancesResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// ListTaskDefinitionsReq encapsulates ListTaskDefinitions req params
+type ListTaskDefinitionsReq struct {
+ FamilyPrefix string
+ MaxResults int32
+ NextToken string
+}
+
+// ListTaskDefinitionsResp encapsuates the ListTaskDefinitions response
+type ListTaskDefinitionsResp struct {
+ TaskDefinitionArns []string `xml:"ListTaskDefinitionsResult>taskDefinitionArns>member"`
+ NextToken string `xml:"ListTaskDefinitionsResult>nextToken"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// ListTaskDefinitions Returns a list of task definitions that are registered to your account.
+func (e *ECS) ListTaskDefinitions(req *ListTaskDefinitionsReq) (
+ *ListTaskDefinitionsResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("ListTaskDefinitions")
+ if req.MaxResults > 0 {
+ params["maxResults"] = strconv.Itoa(int(req.MaxResults))
+ }
+ if req.FamilyPrefix != "" {
+ params["familyPrefix"] = req.FamilyPrefix
+ }
+ if req.NextToken != "" {
+ params["nextToken"] = req.NextToken
+ }
+
+ resp := new(ListTaskDefinitionsResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// ListTasksReq encapsulates ListTasks req params
+type ListTasksReq struct {
+ Cluster string
+ ContainerInstance string
+ Family string
+ MaxResults int32
+ NextToken string
+}
+
+// ListTasksResp encapsuates the ListTasks response
+type ListTasksResp struct {
+ TaskArns []string `xml:"ListTasksResult>taskArns>member"`
+ NextToken string `xml:"ListTasksResult>nextToken"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// ListTasks Returns a list of tasks for a specified cluster.
+// You can filter the results by family name or by a particular container instance
+// with the family and containerInstance parameters.
+func (e *ECS) ListTasks(req *ListTasksReq) (
+ *ListTasksResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("ListTasks")
+ if req.MaxResults > 0 {
+ params["maxResults"] = strconv.Itoa(int(req.MaxResults))
+ }
+ if req.Cluster != "" {
+ params["cluster"] = req.Cluster
+ }
+ if req.ContainerInstance != "" {
+ params["containerInstance"] = req.ContainerInstance
+ }
+ if req.Family != "" {
+ params["family"] = req.Family
+ }
+ if req.NextToken != "" {
+ params["nextToken"] = req.NextToken
+ }
+
+ resp := new(ListTasksResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// RegisterContainerInstanceReq encapsulates RegisterContainerInstance req params
+type RegisterContainerInstanceReq struct {
+ Cluster string
+ InstanceIdentityDocument string
+ InstanceIdentityDocumentSignature string
+ TotalResources []Resource
+}
+
+// DeregisterContainerInstanceResp encapsulates RegisterContainerInstance response
+type RegisterContainerInstanceResp struct {
+ ContainerInstance ContainerInstance `xml:"RegisterContainerInstanceResult>containerInstance"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// RegisterContainerInstance registers an Amazon EC2 instance into the specified cluster.
+// This instance will become available to place containers on.
+func (e *ECS) RegisterContainerInstance(req *RegisterContainerInstanceReq) (
+ resp *RegisterContainerInstanceResp, err error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("RegisterContainerInstance")
+ if req.InstanceIdentityDocument != "" {
+ params["instanceIdentityDocument"] = req.InstanceIdentityDocument
+ }
+ if req.InstanceIdentityDocumentSignature != "" {
+ params["instanceIdentityDocumentSignature"] = req.InstanceIdentityDocumentSignature
+ }
+ if req.Cluster != "" {
+ params["cluster"] = req.Cluster
+ }
+ // Marshal Resources
+ for i, r := range req.TotalResources {
+ key := fmt.Sprintf("totalResources.member.%d", i+1)
+ params[fmt.Sprintf("%s.doubleValue", key)] = strconv.FormatFloat(r.DoubleValue, 'f', 1, 64)
+ params[fmt.Sprintf("%s.integerValue", key)] = strconv.Itoa(int(r.IntegerValue))
+ params[fmt.Sprintf("%s.longValue", key)] = strconv.Itoa(int(r.LongValue))
+ params[fmt.Sprintf("%s.name", key)] = r.Name
+ params[fmt.Sprintf("%s.type", key)] = r.Type
+ for k, sv := range r.StringSetValue {
+ params[fmt.Sprintf("%s.stringSetValue.member.%d", key, k+1)] = sv
+ }
+ }
+
+ resp = new(RegisterContainerInstanceResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// RegisterTaskDefinitionReq encapsulates RegisterTaskDefinition req params
+type RegisterTaskDefinitionReq struct {
+ Family string
+ ContainerDefinitions []ContainerDefinition
+ Volumes []Volume
+}
+
+// RegisterTaskDefinitionResp encapsulates RegisterTaskDefinition response
+type RegisterTaskDefinitionResp struct {
+ TaskDefinition TaskDefinition `xml:"RegisterTaskDefinitionResult>taskDefinition"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// RegisterTaskDefinition registers a new task definition from the supplied family and containerDefinitions.
+func (e *ECS) RegisterTaskDefinition(req *RegisterTaskDefinitionReq) (
+ resp *RegisterTaskDefinitionResp, err error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+ params := makeParams("RegisterTaskDefinition")
+ if req.Family != "" {
+ params["family"] = req.Family
+ }
+
+ // Marshal Container Definitions
+ for i, c := range req.ContainerDefinitions {
+ key := fmt.Sprintf("containerDefinitions.member.%d", i+1)
+ params[fmt.Sprintf("%s.cpu", key)] = strconv.Itoa(int(c.Cpu))
+ params[fmt.Sprintf("%s.essential", key)] = strconv.FormatBool(c.Essential)
+ params[fmt.Sprintf("%s.image", key)] = c.Image
+ params[fmt.Sprintf("%s.memory", key)] = strconv.Itoa(int(c.Memory))
+ params[fmt.Sprintf("%s.name", key)] = c.Name
+
+ for k, cmd := range c.Command {
+ params[fmt.Sprintf("%s.command.member.%d", key, k+1)] = cmd
+ }
+ for k, ep := range c.EntryPoint {
+ params[fmt.Sprintf("%s.entryPoint.member.%d", key, k+1)] = ep
+ }
+ for k, env := range c.Environment {
+ params[fmt.Sprintf("%s.environment.member.%d.name", key, k+1)] = env.Name
+ params[fmt.Sprintf("%s.environment.member.%d.value", key, k+1)] = env.Value
+ }
+ for k, l := range c.Links {
+ params[fmt.Sprintf("%s.links.member.%d", key, k+1)] = l
+ }
+ for k, p := range c.PortMappings {
+ params[fmt.Sprintf("%s.portMappings.member.%d.containerPort", key, k+1)] = strconv.Itoa(int(p.ContainerPort))
+ params[fmt.Sprintf("%s.portMappings.member.%d.hostPort", key, k+1)] = strconv.Itoa(int(p.HostPort))
+ }
+ for k, m := range c.MountPoints {
+ params[fmt.Sprintf("%s.mountPoints.member.%d.containerPath", key, k+1)] = m.ContainerPath
+ params[fmt.Sprintf("%s.mountPoints.member.%d.readOnly", key, k+1)] = strconv.FormatBool(m.ReadOnly)
+ params[fmt.Sprintf("%s.mountPoints.member.%d.sourceVolume", key, k+1)] = m.SourceVolume
+ }
+ for k, v := range c.VolumesFrom {
+ params[fmt.Sprintf("%s.volumesFrom.member.%d.readOnly", key, k+1)] = strconv.FormatBool(v.ReadOnly)
+ params[fmt.Sprintf("%s.volumesFrom.member.%d.sourceContainer", key, k+1)] = v.SourceContainer
+ }
+ }
+
+ for k, v := range req.Volumes {
+ params[fmt.Sprintf("volumes.member.%d.name", k+1)] = v.Name
+ params[fmt.Sprintf("volumes.member.%d.host.sourcePath", k+1)] = v.Host.SourcePath
+ }
+
+ resp = new(RegisterTaskDefinitionResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// RunTaskReq encapsulates RunTask req params
+type RunTaskReq struct {
+ Cluster string
+ Count int32
+ Overrides TaskOverride
+ TaskDefinition string
+}
+
+// RunTaskResp encapsuates the RunTask response
+type RunTaskResp struct {
+ Tasks []Task `xml:"RunTaskResult>tasks>member"`
+ Failures []Failure `xml:"RunTaskResult>failures>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// RunTask Start a task using random placement and the default Amazon ECS scheduler.
+// If you want to use your own scheduler or place a task on a specific container instance,
+// use StartTask instead.
+func (e *ECS) RunTask(req *RunTaskReq) (*RunTaskResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("RunTask")
+ if req.Count > 0 {
+ params["count"] = strconv.Itoa(int(req.Count))
+ }
+ if req.Cluster != "" {
+ params["cluster"] = req.Cluster
+ }
+ if req.TaskDefinition != "" {
+ params["taskDefinition"] = req.TaskDefinition
+ }
+
+ for i, co := range req.Overrides.ContainerOverrides {
+ key := fmt.Sprintf("overrides.containerOverrides.member.%d", i+1)
+ params[fmt.Sprintf("%s.name", key)] = co.Name
+ for k, cmd := range co.Command {
+ params[fmt.Sprintf("%s.command.member.%d", key, k+1)] = cmd
+ }
+ for k, env := range co.Environment {
+ params[fmt.Sprintf("%s.environment.member.%d.name", key, k+1)] = env.Name
+ params[fmt.Sprintf("%s.environment.member.%d.value", key, k+1)] = env.Value
+ }
+ }
+
+ resp := new(RunTaskResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// StartTaskReq encapsulates StartTask req params
+type StartTaskReq struct {
+ Cluster string
+ ContainerInstances []string
+ Overrides TaskOverride
+ TaskDefinition string
+}
+
+// StartTaskResp encapsuates the StartTask response
+type StartTaskResp struct {
+ Tasks []Task `xml:"StartTaskResult>tasks>member"`
+ Failures []Failure `xml:"StartTaskResult>failures>member"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// StartTask Starts a new task from the specified task definition on the specified
+// container instance or instances. If you want to use the default Amazon ECS scheduler
+// to place your task, use RunTask instead.
+func (e *ECS) StartTask(req *StartTaskReq) (*StartTaskResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("StartTask")
+ if req.Cluster != "" {
+ params["cluster"] = req.Cluster
+ }
+ if req.TaskDefinition != "" {
+ params["taskDefinition"] = req.TaskDefinition
+ }
+ for i, ci := range req.ContainerInstances {
+ params[fmt.Sprintf("containerInstances.member.%d", i+1)] = ci
+ }
+ for i, co := range req.Overrides.ContainerOverrides {
+ key := fmt.Sprintf("overrides.containerOverrides.member.%d", i+1)
+ params[fmt.Sprintf("%s.name", key)] = co.Name
+ for k, cmd := range co.Command {
+ params[fmt.Sprintf("%s.command.member.%d", key, k+1)] = cmd
+ }
+ }
+
+ resp := new(StartTaskResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// StopTaskReq encapsulates StopTask req params
+type StopTaskReq struct {
+ Cluster string
+ Task string
+}
+
+// StopTaskResp encapsuates the StopTask response
+type StopTaskResp struct {
+ Task Task `xml:"StopTaskResult>task"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// StopTask stops a running task
+func (e *ECS) StopTask(req *StopTaskReq) (*StopTaskResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("StopTask")
+ if req.Cluster != "" {
+ params["cluster"] = req.Cluster
+ }
+ if req.Task != "" {
+ params["task"] = req.Task
+ }
+
+ resp := new(StopTaskResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// SubmitContainerStateChangeReq encapsulates SubmitContainerStateChange req params
+type SubmitContainerStateChangeReq struct {
+ Cluster string
+ ContainerName string
+ ExitCode int32
+ NetworkBindings []NetworkBinding
+ Reason string
+ Status string
+ Task string
+}
+
+// SubmitContainerStateChangeResp encapsuates the SubmitContainerStateChange response
+type SubmitContainerStateChangeResp struct {
+ Acknowledgment string `xml:"SubmitContainerStateChangeResult>acknowledgment"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// SubmitContainerStateChange is used to acknowledge that a container changed states.
+// Note: This action is only used by the Amazon EC2 Container Service agent,
+// and it is not intended for use outside of the agent.
+func (e *ECS) SubmitContainerStateChange(req *SubmitContainerStateChangeReq) (
+ *SubmitContainerStateChangeResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("SubmitContainerStateChange")
+ if req.Cluster != "" {
+ params["cluster"] = req.Cluster
+ }
+ if req.ContainerName != "" {
+ params["containerName"] = req.ContainerName
+ }
+ if req.Reason != "" {
+ params["reason"] = req.Reason
+ }
+ if req.Status != "" {
+ params["status"] = req.Status
+ }
+ if req.Task != "" {
+ params["task"] = req.Task
+ }
+ for i, nb := range req.NetworkBindings {
+ key := fmt.Sprintf("networkBindings.member.%d", i+1)
+ params[fmt.Sprintf("%s.bindIp", key)] = nb.BindIp
+ params[fmt.Sprintf("%s.containerPort", key)] = strconv.Itoa(int(nb.ContainerPort))
+ params[fmt.Sprintf("%s.hostPort", key)] = strconv.Itoa(int(nb.HostPort))
+ }
+ params["exitCode"] = strconv.Itoa(int(req.ExitCode))
+
+ resp := new(SubmitContainerStateChangeResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
+
+// SubmitTaskStateChangeReq encapsulates SubmitTaskStateChange req params
+type SubmitTaskStateChangeReq struct {
+ Cluster string
+ Reason string
+ Status string
+ Task string
+}
+
+// SubmitTaskStateChangeResp encapsuates the SubmitTaskStateChange response
+type SubmitTaskStateChangeResp struct {
+ Acknowledgment string `xml:"SubmitTaskStateChangeResult>acknowledgment"`
+ RequestId string `xml:"ResponseMetadata>RequestId"`
+}
+
+// SubmitTaskStateChange is used to acknowledge that a task changed states.
+// Note: This action is only used by the Amazon EC2 Container Service agent,
+// and it is not intended for use outside of the agent.
+func (e *ECS) SubmitTaskStateChange(req *SubmitTaskStateChangeReq) (
+ *SubmitTaskStateChangeResp, error) {
+ if req == nil {
+ return nil, fmt.Errorf("The req params cannot be nil")
+ }
+
+ params := makeParams("SubmitTaskStateChange")
+ if req.Cluster != "" {
+ params["cluster"] = req.Cluster
+ }
+
+ if req.Reason != "" {
+ params["reason"] = req.Reason
+ }
+ if req.Status != "" {
+ params["status"] = req.Status
+ }
+ if req.Task != "" {
+ params["task"] = req.Task
+ }
+
+ resp := new(SubmitTaskStateChangeResp)
+ if err := e.query(params, resp); err != nil {
+ return nil, err
+ }
+ return resp, nil
+}
diff --git a/vendor/github.com/goamz/goamz/ecs/ecs_test.go b/vendor/github.com/goamz/goamz/ecs/ecs_test.go
new file mode 100644
index 000000000..7fe4a74ae
--- /dev/null
+++ b/vendor/github.com/goamz/goamz/ecs/ecs_test.go
@@ -0,0 +1,806 @@
+package ecs
+
+import (
+ "testing"
+
+ . "gopkg.in/check.v1"
+
+ "github.com/goamz/goamz/aws"
+ "github.com/goamz/goamz/testutil"
+)
+
+func Test(t *testing.T) {
+ TestingT(t)
+}
+
+var _ = Suite(&S{})
+
+type S struct {
+ ecs *ECS
+}
+
+var testServer = testutil.NewHTTPServer()
+
+var mockTest bool
+
+func (s *S) SetUpSuite(c *C) {
+ testServer.Start()
+ auth := aws.Auth{AccessKey: "abc", SecretKey: "123"}
+ s.ecs = New(auth, aws.Region{ECSEndpoint: testServer.URL})
+}
+
+func (s *S) TearDownTest(c *C) {
+ testServer.Flush()
+}
+
+// --------------------------------------------------------------------------
+// Detailed Unit Tests
+
+func (s *S) TestCreateCluster(c *C) {
+ testServer.Response(200, nil, CreateClusterResponse)
+ req := &CreateClusterReq{
+ ClusterName: "default",
+ }
+ resp, err := s.ecs.CreateCluster(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "CreateCluster")
+ c.Assert(values.Get("clusterName"), Equals, "default")
+
+ c.Assert(resp.Cluster.ClusterArn, Equals, "arn:aws:ecs:region:aws_account_id:cluster/default")
+ c.Assert(resp.Cluster.ClusterName, Equals, "default")
+ c.Assert(resp.Cluster.Status, Equals, "ACTIVE")
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestDeregisterContainerInstance(c *C) {
+ testServer.Response(200, nil, DeregisterContainerInstanceResponse)
+ req := &DeregisterContainerInstanceReq{
+ Cluster: "default",
+ ContainerInstance: "uuid",
+ Force: true,
+ }
+ resp, err := s.ecs.DeregisterContainerInstance(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "DeregisterContainerInstance")
+ c.Assert(values.Get("cluster"), Equals, "default")
+ c.Assert(values.Get("containerInstance"), Equals, "uuid")
+ c.Assert(values.Get("force"), Equals, "true")
+
+ expectedResource := []Resource{
+ {
+ DoubleValue: 0.0,
+ IntegerValue: 2048,
+ LongValue: 0,
+ Name: "CPU",
+ Type: "INTEGER",
+ },
+ {
+ DoubleValue: 0.0,
+ IntegerValue: 3955,
+ LongValue: 0,
+ Name: "MEMORY",
+ Type: "INTEGER",
+ },
+ {
+ DoubleValue: 0.0,
+ IntegerValue: 0,
+ LongValue: 0,
+ Name: "PORTS",
+ StringSetValue: []string{"2376", "22", "51678", "2375"},
+ Type: "STRINGSET",
+ },
+ }
+
+ c.Assert(resp.ContainerInstance.AgentConnected, Equals, false)
+ c.Assert(resp.ContainerInstance.ContainerInstanceArn, Equals, "arn:aws:ecs:us-east-1:aws_account_id:container-instance/container_instance_UUID")
+ c.Assert(resp.ContainerInstance.Status, Equals, "INACTIVE")
+ c.Assert(resp.ContainerInstance.Ec2InstanceId, Equals, "instance_id")
+ c.Assert(resp.ContainerInstance.RegisteredResources, DeepEquals, expectedResource)
+ c.Assert(resp.ContainerInstance.RemainingResources, DeepEquals, expectedResource)
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestDeregisterTaskDefinition(c *C) {
+ testServer.Response(200, nil, DeregisterTaskDefinitionResponse)
+ req := &DeregisterTaskDefinitionReq{
+ TaskDefinition: "sleep360:2",
+ }
+ resp, err := s.ecs.DeregisterTaskDefinition(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "DeregisterTaskDefinition")
+ c.Assert(values.Get("taskDefinition"), Equals, "sleep360:2")
+
+ expected := TaskDefinition{
+ Family: "sleep360",
+ Revision: 2,
+ TaskDefinitionArn: "arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2",
+ ContainerDefinitions: []ContainerDefinition{
+ {
+ Command: []string{"sleep", "360"},
+ Cpu: 10,
+ EntryPoint: []string{"/bin/sh"},
+ Environment: []KeyValuePair{
+ {
+ Name: "envVar",
+ Value: "foo",
+ },
+ },
+ Essential: true,
+ Image: "busybox",
+ Memory: 10,
+ Name: "sleep",
+ },
+ },
+ }
+
+ c.Assert(resp.TaskDefinition, DeepEquals, expected)
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestDescribeClusters(c *C) {
+ testServer.Response(200, nil, DescribeClustersResponse)
+ req := &DescribeClustersReq{
+ Clusters: []string{"test", "default"},
+ }
+ resp, err := s.ecs.DescribeClusters(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "DescribeClusters")
+ c.Assert(values.Get("clusters.member.1"), Equals, "test")
+ c.Assert(values.Get("clusters.member.2"), Equals, "default")
+
+ expected := []Cluster{
+ {
+ ClusterName: "test",
+ ClusterArn: "arn:aws:ecs:us-east-1:aws_account_id:cluster/test",
+ Status: "ACTIVE",
+ },
+ {
+ ClusterName: "default",
+ ClusterArn: "arn:aws:ecs:us-east-1:aws_account_id:cluster/default",
+ Status: "ACTIVE",
+ },
+ }
+
+ c.Assert(resp.Clusters, DeepEquals, expected)
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestDescribeContainerInstances(c *C) {
+ testServer.Response(200, nil, DescribeContainerInstancesResponse)
+ req := &DescribeContainerInstancesReq{
+ Cluster: "test",
+ ContainerInstances: []string{"arn:aws:ecs:us-east-1:aws_account_id:container-instance/container_instance_UUID"},
+ }
+ resp, err := s.ecs.DescribeContainerInstances(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "DescribeContainerInstances")
+ c.Assert(values.Get("cluster"), Equals, "test")
+ c.Assert(values.Get("containerInstances.member.1"),
+ Equals, "arn:aws:ecs:us-east-1:aws_account_id:container-instance/container_instance_UUID")
+
+ expected := []ContainerInstance{
+ ContainerInstance{
+ AgentConnected: true,
+ ContainerInstanceArn: "arn:aws:ecs:us-east-1:aws_account_id:container-instance/container_instance_UUID",
+ Status: "ACTIVE",
+ Ec2InstanceId: "instance_id",
+ RegisteredResources: []Resource{
+ {
+ DoubleValue: 0.0,
+ IntegerValue: 2048,
+ LongValue: 0,
+ Name: "CPU",
+ Type: "INTEGER",
+ },
+ {
+ DoubleValue: 0.0,
+ IntegerValue: 3955,
+ LongValue: 0,
+ Name: "MEMORY",
+ Type: "INTEGER",
+ },
+ {
+ DoubleValue: 0.0,
+ IntegerValue: 0,
+ LongValue: 0,
+ Name: "PORTS",
+ StringSetValue: []string{"2376", "22", "51678", "2375"},
+ Type: "STRINGSET",
+ },
+ },
+ RemainingResources: []Resource{
+ {
+ DoubleValue: 0.0,
+ IntegerValue: 2048,
+ LongValue: 0,
+ Name: "CPU",
+ Type: "INTEGER",
+ },
+ {
+ DoubleValue: 0.0,
+ IntegerValue: 3955,
+ LongValue: 0,
+ Name: "MEMORY",
+ Type: "INTEGER",
+ },
+ {
+ DoubleValue: 0.0,
+ IntegerValue: 0,
+ LongValue: 0,
+ Name: "PORTS",
+ StringSetValue: []string{"2376", "22", "51678", "2375"},
+ Type: "STRINGSET",
+ },
+ },
+ },
+ }
+
+ c.Assert(resp.ContainerInstances, DeepEquals, expected)
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestDescribeTaskDefinition(c *C) {
+ testServer.Response(200, nil, DescribeTaskDefinitionResponse)
+ req := &DescribeTaskDefinitionReq{
+ TaskDefinition: "sleep360:2",
+ }
+ resp, err := s.ecs.DescribeTaskDefinition(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "DescribeTaskDefinition")
+ c.Assert(values.Get("taskDefinition"), Equals, "sleep360:2")
+
+ expected := TaskDefinition{
+ Family: "sleep360",
+ Revision: 2,
+ TaskDefinitionArn: "arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2",
+ ContainerDefinitions: []ContainerDefinition{
+ {
+ Command: []string{"sleep", "360"},
+ Cpu: 10,
+ EntryPoint: []string{"/bin/sh"},
+ Environment: []KeyValuePair{
+ {
+ Name: "envVar",
+ Value: "foo",
+ },
+ },
+ Essential: true,
+ Image: "busybox",
+ Memory: 10,
+ Name: "sleep",
+ },
+ },
+ }
+
+ c.Assert(resp.TaskDefinition, DeepEquals, expected)
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestDescribeTasks(c *C) {
+ testServer.Response(200, nil, DescribeTasksResponse)
+ req := &DescribeTasksReq{
+ Cluster: "test",
+ Tasks: []string{"arn:aws:ecs:us-east-1:aws_account_id:task/UUID"},
+ }
+ resp, err := s.ecs.DescribeTasks(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "DescribeTasks")
+ c.Assert(values.Get("cluster"), Equals, "test")
+ c.Assert(values.Get("tasks.member.1"),
+ Equals, "arn:aws:ecs:us-east-1:aws_account_id:task/UUID")
+
+ expected := []Task{
+ Task{
+ Containers: []Container{
+ {
+ TaskArn: "arn:aws:ecs:us-east-1:aws_account_id:task/UUID",
+ Name: "sleep",
+ ContainerArn: "arn:aws:ecs:us-east-1:aws_account_id:container/UUID",
+ LastStatus: "RUNNING",
+ },
+ },
+ Overrides: TaskOverride{
+ ContainerOverrides: []ContainerOverride{
+ {
+ Name: "sleep",
+ },
+ },
+ },
+ DesiredStatus: "RUNNING",
+ TaskArn: "arn:aws:ecs:us-east-1:aws_account_id:task/UUID",
+ ContainerInstanceArn: "arn:aws:ecs:us-east-1:aws_account_id:container-instance/UUID",
+ LastStatus: "RUNNING",
+ TaskDefinitionArn: "arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2",
+ },
+ }
+
+ c.Assert(resp.Tasks, DeepEquals, expected)
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestDiscoverPollEndpoint(c *C) {
+ testServer.Response(200, nil, DiscoverPollEndpointResponse)
+ req := &DiscoverPollEndpointReq{
+ ContainerInstance: "arn:aws:ecs:us-east-1:aws_account_id:container-instance/UUID",
+ }
+ resp, err := s.ecs.DiscoverPollEndpoint(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "DiscoverPollEndpoint")
+ c.Assert(values.Get("containerInstance"),
+ Equals, "arn:aws:ecs:us-east-1:aws_account_id:container-instance/UUID")
+
+ c.Assert(resp.Endpoint, Equals, "https://ecs-x-1.us-east-1.amazonaws.com/")
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestListClusters(c *C) {
+ testServer.Response(200, nil, ListClustersResponse)
+ req := &ListClustersReq{
+ MaxResults: 2,
+ NextToken: "Token_UUID",
+ }
+ resp, err := s.ecs.ListClusters(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "ListClusters")
+ c.Assert(values.Get("maxResults"), Equals, "2")
+ c.Assert(values.Get("nextToken"), Equals, "Token_UUID")
+
+ c.Assert(resp.ClusterArns, DeepEquals, []string{"arn:aws:ecs:us-east-1:aws_account_id:cluster/default",
+ "arn:aws:ecs:us-east-1:aws_account_id:cluster/test"})
+ c.Assert(resp.NextToken, Equals, "token_UUID")
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestListContainerInstances(c *C) {
+ testServer.Response(200, nil, ListContainerInstancesResponse)
+ req := &ListContainerInstancesReq{
+ MaxResults: 2,
+ NextToken: "Token_UUID",
+ Cluster: "test",
+ }
+ resp, err := s.ecs.ListContainerInstances(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "ListContainerInstances")
+ c.Assert(values.Get("maxResults"), Equals, "2")
+ c.Assert(values.Get("cluster"), Equals, "test")
+ c.Assert(values.Get("nextToken"), Equals, "Token_UUID")
+
+ c.Assert(resp.ContainerInstanceArns, DeepEquals, []string{
+ "arn:aws:ecs:us-east-1:aws_account_id:container-instance/uuid-1",
+ "arn:aws:ecs:us-east-1:aws_account_id:container-instance/uuid-2"})
+ c.Assert(resp.NextToken, Equals, "token_UUID")
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestListTaskDefinitions(c *C) {
+ testServer.Response(200, nil, ListTaskDefinitionsResponse)
+ req := &ListTaskDefinitionsReq{
+ MaxResults: 2,
+ NextToken: "Token_UUID",
+ FamilyPrefix: "sleep360",
+ }
+ resp, err := s.ecs.ListTaskDefinitions(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "ListTaskDefinitions")
+ c.Assert(values.Get("maxResults"), Equals, "2")
+ c.Assert(values.Get("familyPrefix"), Equals, "sleep360")
+ c.Assert(values.Get("nextToken"), Equals, "Token_UUID")
+
+ c.Assert(resp.TaskDefinitionArns, DeepEquals, []string{
+ "arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:1",
+ "arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2"})
+ c.Assert(resp.NextToken, Equals, "token_UUID")
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestListTasks(c *C) {
+ testServer.Response(200, nil, ListTasksResponse)
+ req := &ListTasksReq{
+ MaxResults: 2,
+ NextToken: "Token_UUID",
+ Family: "sleep360",
+ Cluster: "test",
+ ContainerInstance: "container_uuid",
+ }
+ resp, err := s.ecs.ListTasks(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "ListTasks")
+ c.Assert(values.Get("maxResults"), Equals, "2")
+ c.Assert(values.Get("family"), Equals, "sleep360")
+ c.Assert(values.Get("containerInstance"), Equals, "container_uuid")
+ c.Assert(values.Get("cluster"), Equals, "test")
+ c.Assert(values.Get("nextToken"), Equals, "Token_UUID")
+
+ c.Assert(resp.TaskArns, DeepEquals, []string{
+ "arn:aws:ecs:us-east-1:aws_account_id:task/uuid_1",
+ "arn:aws:ecs:us-east-1:aws_account_id:task/uuid_2"})
+ c.Assert(resp.NextToken, Equals, "token_UUID")
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestRegisterContainerInstance(c *C) {
+ testServer.Response(200, nil, RegisterContainerInstanceResponse)
+
+ resources := []Resource{
+ {
+ DoubleValue: 0.0,
+ IntegerValue: 2048,
+ LongValue: 0,
+ Name: "CPU",
+ Type: "INTEGER",
+ },
+ {
+ DoubleValue: 0.0,
+ IntegerValue: 3955,
+ LongValue: 0,
+ Name: "MEMORY",
+ Type: "INTEGER",
+ },
+ {
+ DoubleValue: 0.0,
+ IntegerValue: 0,
+ LongValue: 0,
+ Name: "PORTS",
+ StringSetValue: []string{"2376", "22", "51678", "2375"},
+ Type: "STRINGSET",
+ },
+ }
+
+ req := &RegisterContainerInstanceReq{
+ Cluster: "default",
+ InstanceIdentityDocument: "foo",
+ InstanceIdentityDocumentSignature: "baz",
+ TotalResources: resources,
+ }
+
+ resp, err := s.ecs.RegisterContainerInstance(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "RegisterContainerInstance")
+ c.Assert(values.Get("cluster"), Equals, "default")
+ c.Assert(values.Get("instanceIdentityDocument"), Equals, "foo")
+ c.Assert(values.Get("instanceIdentityDocumentSignature"), Equals, "baz")
+ c.Assert(values.Get("totalResources.member.1.doubleValue"), Equals, "0.0")
+ c.Assert(values.Get("totalResources.member.1.integerValue"), Equals, "2048")
+ c.Assert(values.Get("totalResources.member.1.longValue"), Equals, "0")
+ c.Assert(values.Get("totalResources.member.1.name"), Equals, "CPU")
+ c.Assert(values.Get("totalResources.member.1.type"), Equals, "INTEGER")
+ c.Assert(values.Get("totalResources.member.2.doubleValue"), Equals, "0.0")
+ c.Assert(values.Get("totalResources.member.2.integerValue"), Equals, "3955")
+ c.Assert(values.Get("totalResources.member.2.longValue"), Equals, "0")
+ c.Assert(values.Get("totalResources.member.2.name"), Equals, "MEMORY")
+ c.Assert(values.Get("totalResources.member.2.type"), Equals, "INTEGER")
+ c.Assert(values.Get("totalResources.member.3.doubleValue"), Equals, "0.0")
+ c.Assert(values.Get("totalResources.member.3.integerValue"), Equals, "0")
+ c.Assert(values.Get("totalResources.member.3.longValue"), Equals, "0")
+ c.Assert(values.Get("totalResources.member.3.name"), Equals, "PORTS")
+ c.Assert(values.Get("totalResources.member.3.stringSetValue.member.1"), Equals, "2376")
+ c.Assert(values.Get("totalResources.member.3.stringSetValue.member.2"), Equals, "22")
+ c.Assert(values.Get("totalResources.member.3.stringSetValue.member.3"), Equals, "51678")
+ c.Assert(values.Get("totalResources.member.3.stringSetValue.member.4"), Equals, "2375")
+ c.Assert(values.Get("totalResources.member.3.type"), Equals, "STRINGSET")
+
+ c.Assert(resp.ContainerInstance.AgentConnected, Equals, true)
+ c.Assert(resp.ContainerInstance.ContainerInstanceArn, Equals, "arn:aws:ecs:us-east-1:aws_account_id:container-instance/container_instance_UUID")
+ c.Assert(resp.ContainerInstance.Status, Equals, "ACTIVE")
+ c.Assert(resp.ContainerInstance.Ec2InstanceId, Equals, "instance_id")
+ c.Assert(resp.ContainerInstance.RegisteredResources, DeepEquals, resources)
+ c.Assert(resp.ContainerInstance.RemainingResources, DeepEquals, resources)
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestRegisterTaskDefinition(c *C) {
+ testServer.Response(200, nil, RegisterTaskDefinitionResponse)
+
+ CDefinitions := []ContainerDefinition{
+ {
+ Command: []string{"sleep", "360"},
+ Cpu: 10,
+ EntryPoint: []string{"/bin/sh"},
+ Environment: []KeyValuePair{
+ {
+ Name: "envVar",
+ Value: "foo",
+ },
+ },
+ Essential: true,
+ Image: "busybox",
+ Memory: 10,
+ Name: "sleep",
+ MountPoints: []MountPoint{
+ {
+ ContainerPath: "/tmp/myfile",
+ ReadOnly: false,
+ SourceVolume: "/srv/myfile",
+ },
+ {
+ ContainerPath: "/tmp/myfile2",
+ ReadOnly: true,
+ SourceVolume: "/srv/myfile2",
+ },
+ },
+ VolumesFrom: []VolumeFrom{
+ {
+ ReadOnly: true,
+ SourceContainer: "foo",
+ },
+ },
+ },
+ }
+
+ req := &RegisterTaskDefinitionReq{
+ Family: "sleep360",
+ ContainerDefinitions: CDefinitions,
+ Volumes: []Volume{
+ {
+ Name: "/srv/myfile",
+ Host: HostVolumeProperties{
+ SourcePath: "/srv/myfile",
+ },
+ },
+ },
+ }
+ resp, err := s.ecs.RegisterTaskDefinition(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "RegisterTaskDefinition")
+ c.Assert(values.Get("containerDefinitions.member.1.command.member.1"), Equals, "sleep")
+ c.Assert(values.Get("containerDefinitions.member.1.command.member.2"), Equals, "360")
+ c.Assert(values.Get("containerDefinitions.member.1.cpu"), Equals, "10")
+ c.Assert(values.Get("containerDefinitions.member.1.memory"), Equals, "10")
+ c.Assert(values.Get("containerDefinitions.member.1.entryPoint.member.1"), Equals, "/bin/sh")
+ c.Assert(values.Get("containerDefinitions.member.1.environment.member.1.name"), Equals, "envVar")
+ c.Assert(values.Get("containerDefinitions.member.1.environment.member.1.value"), Equals, "foo")
+ c.Assert(values.Get("containerDefinitions.member.1.essential"), Equals, "true")
+ c.Assert(values.Get("containerDefinitions.member.1.image"), Equals, "busybox")
+ c.Assert(values.Get("containerDefinitions.member.1.memory"), Equals, "10")
+ c.Assert(values.Get("containerDefinitions.member.1.name"), Equals, "sleep")
+ c.Assert(values.Get("containerDefinitions.member.1.mountPoints.member.1.containerPath"), Equals, "/tmp/myfile")
+ c.Assert(values.Get("containerDefinitions.member.1.mountPoints.member.1.readOnly"), Equals, "false")
+ c.Assert(values.Get("containerDefinitions.member.1.mountPoints.member.1.sourceVolume"), Equals, "/srv/myfile")
+ c.Assert(values.Get("containerDefinitions.member.1.mountPoints.member.2.containerPath"), Equals, "/tmp/myfile2")
+ c.Assert(values.Get("containerDefinitions.member.1.mountPoints.member.2.readOnly"), Equals, "true")
+ c.Assert(values.Get("containerDefinitions.member.1.mountPoints.member.2.sourceVolume"), Equals, "/srv/myfile2")
+ c.Assert(values.Get("containerDefinitions.member.1.volumesFrom.member.1.readOnly"), Equals, "true")
+ c.Assert(values.Get("containerDefinitions.member.1.volumesFrom.member.1.sourceContainer"), Equals, "foo")
+
+ c.Assert(values.Get("family"), Equals, "sleep360")
+ c.Assert(values.Get("volumes.member.1.name"), Equals, "/srv/myfile")
+ c.Assert(values.Get("volumes.member.1.host.sourcePath"), Equals, "/srv/myfile")
+
+ expected := TaskDefinition{
+ Family: "sleep360",
+ Revision: 2,
+ TaskDefinitionArn: "arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2",
+ ContainerDefinitions: CDefinitions,
+ Volumes: []Volume{
+ {
+ Name: "/srv/myfile",
+ Host: HostVolumeProperties{
+ SourcePath: "/srv/myfile",
+ },
+ },
+ },
+ }
+
+ c.Assert(resp.TaskDefinition, DeepEquals, expected)
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestRunTask(c *C) {
+ testServer.Response(200, nil, RunTaskResponse)
+ req := &RunTaskReq{
+ Cluster: "test",
+ Count: 1,
+ TaskDefinition: "sleep360:2",
+ }
+ resp, err := s.ecs.RunTask(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "RunTask")
+ c.Assert(values.Get("cluster"), Equals, "test")
+ c.Assert(values.Get("count"), Equals, "1")
+ c.Assert(values.Get("taskDefinition"), Equals, "sleep360:2")
+
+ expected := []Task{
+ Task{
+ Containers: []Container{
+ {
+ TaskArn: "arn:aws:ecs:us-east-1:aws_account_id:task/UUID",
+ Name: "sleep",
+ ContainerArn: "arn:aws:ecs:us-east-1:aws_account_id:container/UUID",
+ LastStatus: "RUNNING",
+ },
+ },
+ Overrides: TaskOverride{
+ ContainerOverrides: []ContainerOverride{
+ {
+ Name: "sleep",
+ },
+ },
+ },
+ DesiredStatus: "RUNNING",
+ TaskArn: "arn:aws:ecs:us-east-1:aws_account_id:task/UUID",
+ ContainerInstanceArn: "arn:aws:ecs:us-east-1:aws_account_id:container-instance/UUID",
+ LastStatus: "PENDING",
+ TaskDefinitionArn: "arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2",
+ },
+ }
+
+ c.Assert(resp.Tasks, DeepEquals, expected)
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestStartTask(c *C) {
+ testServer.Response(200, nil, StartTaskResponse)
+ req := &StartTaskReq{
+ Cluster: "test",
+ ContainerInstances: []string{"containerUUID"},
+ TaskDefinition: "sleep360:2",
+ }
+ resp, err := s.ecs.StartTask(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "StartTask")
+ c.Assert(values.Get("cluster"), Equals, "test")
+ c.Assert(values.Get("taskDefinition"), Equals, "sleep360:2")
+ c.Assert(values.Get("containerInstances.member.1"), Equals, "containerUUID")
+
+ expected := []Task{
+ Task{
+ Containers: []Container{
+ {
+ TaskArn: "arn:aws:ecs:us-east-1:aws_account_id:task/UUID",
+ Name: "sleep",
+ ContainerArn: "arn:aws:ecs:us-east-1:aws_account_id:container/UUID",
+ LastStatus: "RUNNING",
+ },
+ },
+ Overrides: TaskOverride{
+ ContainerOverrides: []ContainerOverride{
+ {
+ Name: "sleep",
+ },
+ },
+ },
+ DesiredStatus: "RUNNING",
+ TaskArn: "arn:aws:ecs:us-east-1:aws_account_id:task/UUID",
+ ContainerInstanceArn: "arn:aws:ecs:us-east-1:aws_account_id:container-instance/UUID",
+ LastStatus: "PENDING",
+ TaskDefinitionArn: "arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2",
+ },
+ }
+
+ c.Assert(resp.Tasks, DeepEquals, expected)
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestStopTask(c *C) {
+ testServer.Response(200, nil, StopTaskResponse)
+ req := &StopTaskReq{
+ Cluster: "test",
+ Task: "arn:aws:ecs:us-east-1:aws_account_id:task/UUID",
+ }
+ resp, err := s.ecs.StopTask(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "StopTask")
+ c.Assert(values.Get("cluster"), Equals, "test")
+ c.Assert(values.Get("task"), Equals, "arn:aws:ecs:us-east-1:aws_account_id:task/UUID")
+
+ expected := Task{
+ Containers: []Container{
+ {
+ TaskArn: "arn:aws:ecs:us-east-1:aws_account_id:task/UUID",
+ Name: "sleep",
+ ContainerArn: "arn:aws:ecs:us-east-1:aws_account_id:container/UUID",
+ LastStatus: "RUNNING",
+ },
+ },
+ Overrides: TaskOverride{
+ ContainerOverrides: []ContainerOverride{
+ {
+ Name: "sleep",
+ },
+ },
+ },
+ DesiredStatus: "STOPPED",
+ TaskArn: "arn:aws:ecs:us-east-1:aws_account_id:task/UUID",
+ ContainerInstanceArn: "arn:aws:ecs:us-east-1:aws_account_id:container-instance/UUID",
+ LastStatus: "RUNNING",
+ TaskDefinitionArn: "arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2",
+ }
+
+ c.Assert(resp.Task, DeepEquals, expected)
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestSubmitContainerStateChange(c *C) {
+ testServer.Response(200, nil, SubmitContainerStateChangeResponse)
+ networkBindings := []NetworkBinding{
+ {
+ BindIp: "127.0.0.1",
+ ContainerPort: 80,
+ HostPort: 80,
+ },
+ }
+ req := &SubmitContainerStateChangeReq{
+ Cluster: "test",
+ ContainerName: "container",
+ ExitCode: 0,
+ Reason: "reason",
+ Status: "status",
+ Task: "taskUUID",
+ NetworkBindings: networkBindings,
+ }
+
+ resp, err := s.ecs.SubmitContainerStateChange(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "SubmitContainerStateChange")
+ c.Assert(values.Get("cluster"), Equals, "test")
+ c.Assert(values.Get("containerName"), Equals, "container")
+ c.Assert(values.Get("exitCode"), Equals, "0")
+ c.Assert(values.Get("reason"), Equals, "reason")
+ c.Assert(values.Get("status"), Equals, "status")
+ c.Assert(values.Get("task"), Equals, "taskUUID")
+ c.Assert(values.Get("networkBindings.member.1.bindIp"), Equals, "127.0.0.1")
+ c.Assert(values.Get("networkBindings.member.1.containerPort"), Equals, "80")
+ c.Assert(values.Get("networkBindings.member.1.hostPort"), Equals, "80")
+
+ c.Assert(resp.Acknowledgment, Equals, "ACK")
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
+
+func (s *S) TestSubmitTaskStateChange(c *C) {
+ testServer.Response(200, nil, SubmitTaskStateChangeResponse)
+ req := &SubmitTaskStateChangeReq{
+ Cluster: "test",
+ Reason: "reason",
+ Status: "status",
+ Task: "taskUUID",
+ }
+
+ resp, err := s.ecs.SubmitTaskStateChange(req)
+ c.Assert(err, IsNil)
+ values := testServer.WaitRequest().PostForm
+ c.Assert(values.Get("Version"), Equals, "2014-11-13")
+ c.Assert(values.Get("Action"), Equals, "SubmitTaskStateChange")
+ c.Assert(values.Get("cluster"), Equals, "test")
+ c.Assert(values.Get("reason"), Equals, "reason")
+ c.Assert(values.Get("status"), Equals, "status")
+ c.Assert(values.Get("task"), Equals, "taskUUID")
+
+ c.Assert(resp.Acknowledgment, Equals, "ACK")
+ c.Assert(resp.RequestId, Equals, "8d798a29-f083-11e1-bdfb-cb223EXAMPLE")
+}
diff --git a/vendor/github.com/goamz/goamz/ecs/responses_test.go b/vendor/github.com/goamz/goamz/ecs/responses_test.go
new file mode 100644
index 000000000..6a4b0ce71
--- /dev/null
+++ b/vendor/github.com/goamz/goamz/ecs/responses_test.go
@@ -0,0 +1,637 @@
+package ecs
+
+var CreateClusterResponse = `
+<CreateClusterResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+ <CreateClusterResult>
+ <cluster>
+ <clusterArn>arn:aws:ecs:region:aws_account_id:cluster/default</clusterArn>
+ <clusterName>default</clusterName>
+ <status>ACTIVE</status>
+ </cluster>
+ </CreateClusterResult>
+</CreateClusterResponse>
+`
+var DeregisterContainerInstanceResponse = `
+<DeregisterContainerInstanceResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+ <DeregisterContainerInstanceResult>
+ <containerInstance>
+ <agentConnected>False</agentConnected>
+ <containerInstanceArn>arn:aws:ecs:us-east-1:aws_account_id:container-instance/container_instance_UUID</containerInstanceArn>
+ <ec2InstanceId>instance_id</ec2InstanceId>
+ <status>INACTIVE</status>
+ <registeredResources>
+ <member>
+ <integerValue>2048</integerValue>
+ <longValue>0</longValue>
+ <type>INTEGER</type>
+ <name>CPU</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ <member>
+ <integerValue>3955</integerValue>
+ <longValue>0</longValue>
+ <type>INTEGER</type>
+ <name>MEMORY</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ <member>
+ <integerValue>0</integerValue>
+ <longValue>0</longValue>
+ <type>STRINGSET</type>
+ <stringSetValue>
+ <member>2376</member>
+ <member>22</member>
+ <member>51678</member>
+ <member>2375</member>
+ </stringSetValue>
+ <name>PORTS</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ </registeredResources>
+ <remainingResources>
+ <member>
+ <integerValue>2048</integerValue>
+ <longValue>0</longValue>
+ <type>INTEGER</type>
+ <name>CPU</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ <member>
+ <integerValue>3955</integerValue>
+ <longValue>0</longValue>
+ <type>INTEGER</type>
+ <name>MEMORY</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ <member>
+ <integerValue>0</integerValue>
+ <longValue>0</longValue>
+ <type>STRINGSET</type>
+ <stringSetValue>
+ <member>2376</member>
+ <member>22</member>
+ <member>51678</member>
+ <member>2375</member>
+ </stringSetValue>
+ <name>PORTS</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ </remainingResources>
+ </containerInstance>
+ </DeregisterContainerInstanceResult>
+</DeregisterContainerInstanceResponse>
+`
+
+var DeregisterTaskDefinitionResponse = `
+<DeregisterTaskDefinitionResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <DeregisterTaskDefinitionResult>
+ <taskDefinition>
+ <revision>2</revision>
+ <family>sleep360</family>
+ <containerDefinitions>
+ <member>
+ <portMappings/>
+ <essential>true</essential>
+ <environment>
+ <member>
+ <name>envVar</name>
+ <value>foo</value>
+ </member>
+ </environment>
+ <entryPoint>
+ <member>/bin/sh</member>
+ </entryPoint>
+ <name>sleep</name>
+ <command>
+ <member>sleep</member>
+ <member>360</member>
+ </command>
+ <cpu>10</cpu>
+ <image>busybox</image>
+ <memory>10</memory>
+ </member>
+ </containerDefinitions>
+ <taskDefinitionArn>arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2</taskDefinitionArn>
+ </taskDefinition>
+ </DeregisterTaskDefinitionResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</DeregisterTaskDefinitionResponse>
+`
+
+var DescribeClustersResponse = `
+<DescribeClustersResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <DescribeClustersResult>
+ <failures/>
+ <clusters>
+ <member>
+ <clusterName>test</clusterName>
+ <clusterArn>arn:aws:ecs:us-east-1:aws_account_id:cluster/test</clusterArn>
+ <status>ACTIVE</status>
+ </member>
+ <member>
+ <clusterName>default</clusterName>
+ <clusterArn>arn:aws:ecs:us-east-1:aws_account_id:cluster/default</clusterArn>
+ <status>ACTIVE</status>
+ </member>
+ </clusters>
+ </DescribeClustersResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</DescribeClustersResponse>
+`
+
+var DescribeContainerInstancesResponse = `
+<DescribeContainerInstancesResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+ <DescribeContainerInstancesResult>
+ <failures/>
+ <containerInstances>
+ <member>
+ <agentConnected>true</agentConnected>
+ <containerInstanceArn>arn:aws:ecs:us-east-1:aws_account_id:container-instance/container_instance_UUID</containerInstanceArn>
+ <ec2InstanceId>instance_id</ec2InstanceId>
+ <status>ACTIVE</status>
+ <registeredResources>
+ <member>
+ <integerValue>2048</integerValue>
+ <longValue>0</longValue>
+ <type>INTEGER</type>
+ <name>CPU</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ <member>
+ <integerValue>3955</integerValue>
+ <longValue>0</longValue>
+ <type>INTEGER</type>
+ <name>MEMORY</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ <member>
+ <integerValue>0</integerValue>
+ <longValue>0</longValue>
+ <type>STRINGSET</type>
+ <stringSetValue>
+ <member>2376</member>
+ <member>22</member>
+ <member>51678</member>
+ <member>2375</member>
+ </stringSetValue>
+ <name>PORTS</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ </registeredResources>
+ <remainingResources>
+ <member>
+ <integerValue>2048</integerValue>
+ <longValue>0</longValue>
+ <type>INTEGER</type>
+ <name>CPU</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ <member>
+ <integerValue>3955</integerValue>
+ <longValue>0</longValue>
+ <type>INTEGER</type>
+ <name>MEMORY</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ <member>
+ <integerValue>0</integerValue>
+ <longValue>0</longValue>
+ <type>STRINGSET</type>
+ <stringSetValue>
+ <member>2376</member>
+ <member>22</member>
+ <member>51678</member>
+ <member>2375</member>
+ </stringSetValue>
+ <name>PORTS</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ </remainingResources>
+ </member>
+ </containerInstances>
+ </DescribeContainerInstancesResult>
+</DescribeContainerInstancesResponse>
+`
+
+var DescribeTaskDefinitionResponse = `
+<DescribeTaskDefinitionResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <DescribeTaskDefinitionResult>
+ <taskDefinition>
+ <revision>2</revision>
+ <family>sleep360</family>
+ <containerDefinitions>
+ <member>
+ <portMappings/>
+ <essential>true</essential>
+ <environment>
+ <member>
+ <name>envVar</name>
+ <value>foo</value>
+ </member>
+ </environment>
+ <entryPoint>
+ <member>/bin/sh</member>
+ </entryPoint>
+ <name>sleep</name>
+ <command>
+ <member>sleep</member>
+ <member>360</member>
+ </command>
+ <cpu>10</cpu>
+ <image>busybox</image>
+ <memory>10</memory>
+ </member>
+ </containerDefinitions>
+ <taskDefinitionArn>arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2</taskDefinitionArn>
+ </taskDefinition>
+ </DescribeTaskDefinitionResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</DescribeTaskDefinitionResponse>
+`
+
+var DescribeTasksResponse = `
+<DescribeTasksResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <DescribeTasksResult>
+ <failures/>
+ <tasks>
+ <member>
+ <containers>
+ <member>
+ <taskArn>arn:aws:ecs:us-east-1:aws_account_id:task/UUID</taskArn>
+ <name>sleep</name>
+ <containerArn>arn:aws:ecs:us-east-1:aws_account_id:container/UUID</containerArn>
+ <networkBindings/>
+ <lastStatus>RUNNING</lastStatus>
+ </member>
+ </containers>
+ <overrides>
+ <containerOverrides>
+ <member>
+ <name>sleep</name>
+ </member>
+ </containerOverrides>
+ </overrides>
+ <desiredStatus>RUNNING</desiredStatus>
+ <taskArn>arn:aws:ecs:us-east-1:aws_account_id:task/UUID</taskArn>
+ <containerInstanceArn>arn:aws:ecs:us-east-1:aws_account_id:container-instance/UUID</containerInstanceArn>
+ <lastStatus>RUNNING</lastStatus>
+ <taskDefinitionArn>arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2</taskDefinitionArn>
+ </member>
+ </tasks>
+ </DescribeTasksResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</DescribeTasksResponse>
+`
+
+var DiscoverPollEndpointResponse = `
+<DiscoverPollEndpointResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <DiscoverPollEndpointResult>
+ <endpoint>https://ecs-x-1.us-east-1.amazonaws.com/</endpoint>
+ </DiscoverPollEndpointResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</DiscoverPollEndpointResponse>
+`
+
+var ListClustersResponse = `
+<ListClustersResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <ListClustersResult>
+ <clusterArns>
+ <member>arn:aws:ecs:us-east-1:aws_account_id:cluster/default</member>
+ <member>arn:aws:ecs:us-east-1:aws_account_id:cluster/test</member>
+ </clusterArns>
+ <nextToken>token_UUID</nextToken>
+ </ListClustersResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListClustersResponse>
+`
+
+var ListContainerInstancesResponse = `
+<ListContainerInstancesResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <ListContainerInstancesResult>
+ <containerInstanceArns>
+ <member>arn:aws:ecs:us-east-1:aws_account_id:container-instance/uuid-1</member>
+ <member>arn:aws:ecs:us-east-1:aws_account_id:container-instance/uuid-2</member>
+ </containerInstanceArns>
+ <nextToken>token_UUID</nextToken>
+ </ListContainerInstancesResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListContainerInstancesResponse>
+`
+
+var ListTaskDefinitionsResponse = `
+<ListTaskDefinitionsResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <ListTaskDefinitionsResult>
+ <taskDefinitionArns>
+ <member>arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:1</member>
+ <member>arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2</member>
+ </taskDefinitionArns>
+ <nextToken>token_UUID</nextToken>
+ </ListTaskDefinitionsResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListTaskDefinitionsResponse>
+`
+
+var ListTasksResponse = `
+<ListTasksResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <ListTasksResult>
+ <taskArns>
+ <member>arn:aws:ecs:us-east-1:aws_account_id:task/uuid_1</member>
+ <member>arn:aws:ecs:us-east-1:aws_account_id:task/uuid_2</member>
+ </taskArns>
+ <nextToken>token_UUID</nextToken>
+ </ListTasksResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</ListTasksResponse>
+`
+
+var RegisterContainerInstanceResponse = `
+<RegisterContainerInstanceResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+ <RegisterContainerInstanceResult>
+ <containerInstance>
+ <agentConnected>True</agentConnected>
+ <containerInstanceArn>arn:aws:ecs:us-east-1:aws_account_id:container-instance/container_instance_UUID</containerInstanceArn>
+ <ec2InstanceId>instance_id</ec2InstanceId>
+ <status>ACTIVE</status>
+ <registeredResources>
+ <member>
+ <integerValue>2048</integerValue>
+ <longValue>0</longValue>
+ <type>INTEGER</type>
+ <name>CPU</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ <member>
+ <integerValue>3955</integerValue>
+ <longValue>0</longValue>
+ <type>INTEGER</type>
+ <name>MEMORY</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ <member>
+ <integerValue>0</integerValue>
+ <longValue>0</longValue>
+ <type>STRINGSET</type>
+ <stringSetValue>
+ <member>2376</member>
+ <member>22</member>
+ <member>51678</member>
+ <member>2375</member>
+ </stringSetValue>
+ <name>PORTS</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ </registeredResources>
+ <remainingResources>
+ <member>
+ <integerValue>2048</integerValue>
+ <longValue>0</longValue>
+ <type>INTEGER</type>
+ <name>CPU</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ <member>
+ <integerValue>3955</integerValue>
+ <longValue>0</longValue>
+ <type>INTEGER</type>
+ <name>MEMORY</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ <member>
+ <integerValue>0</integerValue>
+ <longValue>0</longValue>
+ <type>STRINGSET</type>
+ <stringSetValue>
+ <member>2376</member>
+ <member>22</member>
+ <member>51678</member>
+ <member>2375</member>
+ </stringSetValue>
+ <name>PORTS</name>
+ <doubleValue>0.0</doubleValue>
+ </member>
+ </remainingResources>
+ </containerInstance>
+ </RegisterContainerInstanceResult>
+</RegisterContainerInstanceResponse>
+`
+
+var RegisterTaskDefinitionResponse = `
+<RegisterTaskDefinitionResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <RegisterTaskDefinitionResult>
+ <taskDefinition>
+ <revision>2</revision>
+ <family>sleep360</family>
+ <containerDefinitions>
+ <member>
+ <portMappings/>
+ <essential>true</essential>
+ <environment>
+ <member>
+ <name>envVar</name>
+ <value>foo</value>
+ </member>
+ </environment>
+ <entryPoint>
+ <member>/bin/sh</member>
+ </entryPoint>
+ <name>sleep</name>
+ <command>
+ <member>sleep</member>
+ <member>360</member>
+ </command>
+ <cpu>10</cpu>
+ <image>busybox</image>
+ <memory>10</memory>
+ <mountPoints>
+ <member>
+ <containerPath>/tmp/myfile</containerPath>
+ <readOnly>false</readOnly>
+ <sourceVolume>/srv/myfile</sourceVolume>
+ </member>
+ <member>
+ <containerPath>/tmp/myfile2</containerPath>
+ <readOnly>true</readOnly>
+ <sourceVolume>/srv/myfile2</sourceVolume>
+ </member>
+ </mountPoints>
+ <volumesFrom>
+ <member>
+ <readOnly>true</readOnly>
+ <sourceContainer>foo</sourceContainer>
+ </member>
+ </volumesFrom>
+ </member>
+ </containerDefinitions>
+ <taskDefinitionArn>arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2</taskDefinitionArn>
+ <volumes>
+ <member>
+ <name>/srv/myfile</name>
+ <host>
+ <sourcePath>/srv/myfile</sourcePath>
+ </host>
+ </member>
+ </volumes>
+ </taskDefinition>
+ </RegisterTaskDefinitionResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</RegisterTaskDefinitionResponse>
+`
+
+var RunTaskResponse = `
+<RunTaskResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <RunTaskResult>
+ <failures/>
+ <tasks>
+ <member>
+ <containers>
+ <member>
+ <taskArn>arn:aws:ecs:us-east-1:aws_account_id:task/UUID</taskArn>
+ <name>sleep</name>
+ <containerArn>arn:aws:ecs:us-east-1:aws_account_id:container/UUID</containerArn>
+ <networkBindings/>
+ <lastStatus>RUNNING</lastStatus>
+ </member>
+ </containers>
+ <overrides>
+ <containerOverrides>
+ <member>
+ <name>sleep</name>
+ </member>
+ </containerOverrides>
+ </overrides>
+ <desiredStatus>RUNNING</desiredStatus>
+ <taskArn>arn:aws:ecs:us-east-1:aws_account_id:task/UUID</taskArn>
+ <containerInstanceArn>arn:aws:ecs:us-east-1:aws_account_id:container-instance/UUID</containerInstanceArn>
+ <lastStatus>PENDING</lastStatus>
+ <taskDefinitionArn>arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2</taskDefinitionArn>
+ </member>
+ </tasks>
+ </RunTaskResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</RunTaskResponse>
+`
+
+var StartTaskResponse = `
+<StartTaskResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <StartTaskResult>
+ <failures/>
+ <tasks>
+ <member>
+ <containers>
+ <member>
+ <taskArn>arn:aws:ecs:us-east-1:aws_account_id:task/UUID</taskArn>
+ <name>sleep</name>
+ <containerArn>arn:aws:ecs:us-east-1:aws_account_id:container/UUID</containerArn>
+ <networkBindings/>
+ <lastStatus>RUNNING</lastStatus>
+ </member>
+ </containers>
+ <overrides>
+ <containerOverrides>
+ <member>
+ <name>sleep</name>
+ </member>
+ </containerOverrides>
+ </overrides>
+ <desiredStatus>RUNNING</desiredStatus>
+ <taskArn>arn:aws:ecs:us-east-1:aws_account_id:task/UUID</taskArn>
+ <containerInstanceArn>arn:aws:ecs:us-east-1:aws_account_id:container-instance/UUID</containerInstanceArn>
+ <lastStatus>PENDING</lastStatus>
+ <taskDefinitionArn>arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2</taskDefinitionArn>
+ </member>
+ </tasks>
+ </StartTaskResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</StartTaskResponse>
+`
+
+var StopTaskResponse = `
+<StopTaskResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <StopTaskResult>
+ <task>
+ <containers>
+ <member>
+ <taskArn>arn:aws:ecs:us-east-1:aws_account_id:task/UUID</taskArn>
+ <name>sleep</name>
+ <containerArn>arn:aws:ecs:us-east-1:aws_account_id:container/UUID</containerArn>
+ <networkBindings/>
+ <lastStatus>RUNNING</lastStatus>
+ </member>
+ </containers>
+ <overrides>
+ <containerOverrides>
+ <member>
+ <name>sleep</name>
+ </member>
+ </containerOverrides>
+ </overrides>
+ <desiredStatus>STOPPED</desiredStatus>
+ <taskArn>arn:aws:ecs:us-east-1:aws_account_id:task/UUID</taskArn>
+ <containerInstanceArn>arn:aws:ecs:us-east-1:aws_account_id:container-instance/UUID</containerInstanceArn>
+ <lastStatus>RUNNING</lastStatus>
+ <taskDefinitionArn>arn:aws:ecs:us-east-1:aws_account_id:task-definition/sleep360:2</taskDefinitionArn>
+ </task>
+ </StopTaskResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</StopTaskResponse>
+`
+
+var SubmitContainerStateChangeResponse = `
+<SubmitContainerStateChangeResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <SubmitContainerStateChangeResult>
+ <acknowledgment>ACK</acknowledgment>
+ </SubmitContainerStateChangeResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</SubmitContainerStateChangeResponse>
+`
+
+var SubmitTaskStateChangeResponse = `
+<SubmitTaskStateChangeResponse xmlns="http://ecs.amazonaws.com/doc/2014-11-13/">
+ <SubmitTaskStateChangeResult>
+ <acknowledgment>ACK</acknowledgment>
+ </SubmitTaskStateChangeResult>
+ <ResponseMetadata>
+ <RequestId>8d798a29-f083-11e1-bdfb-cb223EXAMPLE</RequestId>
+ </ResponseMetadata>
+</SubmitTaskStateChangeResponse>
+`