summaryrefslogtreecommitdiffstats
path: root/vendor/github.com/goamz/goamz/ecs/ecs_test.go
blob: 7fe4a74ae0ddbfae80bca1b1bd0b53c872917211 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
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")
}