@@ -18,6 +18,7 @@ package ecs
18
18
19
19
import (
20
20
"context"
21
+ "errors"
21
22
"fmt"
22
23
"io/ioutil"
23
24
"reflect"
@@ -42,7 +43,7 @@ import (
42
43
func TestSimpleConvert (t * testing.T ) {
43
44
bytes , err := ioutil .ReadFile ("testdata/input/simple-single-service.yaml" )
44
45
assert .NilError (t , err )
45
- template := convertYaml (t , string (bytes ), useDefaultVPC )
46
+ template := convertYaml (t , string (bytes ), nil , useDefaultVPC )
46
47
resultAsJSON , err := marshall (template , "yaml" )
47
48
assert .NilError (t , err )
48
49
result := fmt .Sprintf ("%s\n " , string (resultAsJSON ))
@@ -60,7 +61,7 @@ services:
60
61
awslogs-datetime-pattern: "FOO"
61
62
62
63
x-aws-logs_retention: 10
63
- ` , useDefaultVPC )
64
+ ` , nil , useDefaultVPC )
64
65
def := template .Resources ["FooTaskDefinition" ].(* ecs.TaskDefinition )
65
66
logging := getMainContainer (def , t ).LogConfiguration
66
67
if logging != nil {
@@ -80,7 +81,7 @@ services:
80
81
image: hello_world
81
82
env_file:
82
83
- testdata/input/envfile
83
- ` , useDefaultVPC )
84
+ ` , nil , useDefaultVPC )
84
85
def := template .Resources ["FooTaskDefinition" ].(* ecs.TaskDefinition )
85
86
env := getMainContainer (def , t ).Environment
86
87
var found bool
@@ -102,7 +103,7 @@ services:
102
103
- testdata/input/envfile
103
104
environment:
104
105
- "FOO=ZOT"
105
- ` , useDefaultVPC )
106
+ ` , nil , useDefaultVPC )
106
107
def := template .Resources ["FooTaskDefinition" ].(* ecs.TaskDefinition )
107
108
env := getMainContainer (def , t ).Environment
108
109
var found bool
@@ -124,7 +125,7 @@ services:
124
125
replicas: 4
125
126
update_config:
126
127
parallelism: 2
127
- ` , useDefaultVPC )
128
+ ` , nil , useDefaultVPC )
128
129
service := template .Resources ["FooService" ].(* ecs.Service )
129
130
assert .Check (t , service .DeploymentConfiguration .MaximumPercent == 150 )
130
131
assert .Check (t , service .DeploymentConfiguration .MinimumHealthyPercent == 50 )
@@ -139,7 +140,7 @@ services:
139
140
update_config:
140
141
x-aws-min_percent: 25
141
142
x-aws-max_percent: 125
142
- ` , useDefaultVPC )
143
+ ` , nil , useDefaultVPC )
143
144
service := template .Resources ["FooService" ].(* ecs.Service )
144
145
assert .Check (t , service .DeploymentConfiguration .MaximumPercent == 125 )
145
146
assert .Check (t , service .DeploymentConfiguration .MinimumHealthyPercent == 25 )
@@ -151,7 +152,7 @@ services:
151
152
foo:
152
153
image: hello_world
153
154
x-aws-pull_credentials: "secret"
154
- ` , useDefaultVPC )
155
+ ` , nil , useDefaultVPC )
155
156
x := template .Resources ["FooTaskExecutionRole" ]
156
157
assert .Check (t , x != nil )
157
158
role := * (x .(* iam.Role ))
@@ -179,7 +180,7 @@ networks:
179
180
name: public
180
181
back-tier:
181
182
internal: true
182
- ` , useDefaultVPC )
183
+ ` , nil , useDefaultVPC )
183
184
assert .Check (t , template .Resources ["FronttierNetwork" ] != nil )
184
185
assert .Check (t , template .Resources ["BacktierNetwork" ] != nil )
185
186
assert .Check (t , template .Resources ["BacktierNetworkIngress" ] != nil )
@@ -207,7 +208,7 @@ func TestLoadBalancerTypeApplication(t *testing.T) {
207
208
` ,
208
209
}
209
210
for _ , y := range cases {
210
- template := convertYaml (t , y , useDefaultVPC )
211
+ template := convertYaml (t , y , nil , useDefaultVPC )
211
212
lb := template .Resources ["LoadBalancer" ]
212
213
assert .Check (t , lb != nil )
213
214
loadBalancer := * lb .(* elasticloadbalancingv2.LoadBalancer )
@@ -224,7 +225,7 @@ services:
224
225
image: nginx
225
226
foo:
226
227
image: bar
227
- ` , useDefaultVPC )
228
+ ` , nil , useDefaultVPC )
228
229
for _ , r := range template .Resources {
229
230
assert .Check (t , r .AWSCloudFormationType () != "AWS::ElasticLoadBalancingV2::TargetGroup" )
230
231
assert .Check (t , r .AWSCloudFormationType () != "AWS::ElasticLoadBalancingV2::Listener" )
@@ -239,7 +240,7 @@ services:
239
240
image: nginx
240
241
deploy:
241
242
replicas: 10
242
- ` , useDefaultVPC )
243
+ ` , nil , useDefaultVPC )
243
244
s := template .Resources ["TestService" ]
244
245
assert .Check (t , s != nil )
245
246
service := * s .(* ecs.Service )
@@ -251,7 +252,7 @@ func TestTaskSizeConvert(t *testing.T) {
251
252
services:
252
253
test:
253
254
image: nginx
254
- ` , useDefaultVPC )
255
+ ` , nil , useDefaultVPC )
255
256
def := template .Resources ["TestTaskDefinition" ].(* ecs.TaskDefinition )
256
257
assert .Equal (t , def .Cpu , "256" )
257
258
assert .Equal (t , def .Memory , "512" )
@@ -265,7 +266,7 @@ services:
265
266
limits:
266
267
cpus: '0.5'
267
268
memory: 2048M
268
- ` , useDefaultVPC )
269
+ ` , nil , useDefaultVPC )
269
270
def = template .Resources ["TestTaskDefinition" ].(* ecs.TaskDefinition )
270
271
assert .Equal (t , def .Cpu , "512" )
271
272
assert .Equal (t , def .Memory , "2048" )
@@ -279,7 +280,7 @@ services:
279
280
limits:
280
281
cpus: '4'
281
282
memory: 8192M
282
- ` , useDefaultVPC )
283
+ ` , nil , useDefaultVPC )
283
284
def = template .Resources ["TestTaskDefinition" ].(* ecs.TaskDefinition )
284
285
assert .Equal (t , def .Cpu , "4096" )
285
286
assert .Equal (t , def .Memory , "8192" )
@@ -298,7 +299,7 @@ services:
298
299
- discrete_resource_spec:
299
300
kind: gpus
300
301
value: 2
301
- ` , useDefaultVPC , useGPU )
302
+ ` , nil , useDefaultVPC , useGPU )
302
303
def = template .Resources ["TestTaskDefinition" ].(* ecs.TaskDefinition )
303
304
assert .Equal (t , def .Cpu , "4000" )
304
305
assert .Equal (t , def .Memory , "792" )
@@ -314,7 +315,7 @@ services:
314
315
- discrete_resource_spec:
315
316
kind: gpus
316
317
value: 2
317
- ` , useDefaultVPC , useGPU )
318
+ ` , nil , useDefaultVPC , useGPU )
318
319
def = template .Resources ["TestTaskDefinition" ].(* ecs.TaskDefinition )
319
320
assert .Equal (t , def .Cpu , "" )
320
321
assert .Equal (t , def .Memory , "" )
@@ -329,7 +330,7 @@ services:
329
330
devices:
330
331
- capabilities: [gpu]
331
332
count: 2
332
- ` , useDefaultVPC , useGPU )
333
+ ` , nil , useDefaultVPC , useGPU )
333
334
def = template .Resources ["TestTaskDefinition" ].(* ecs.TaskDefinition )
334
335
assert .Equal (t , def .Cpu , "" )
335
336
assert .Equal (t , def .Memory , "" )
@@ -343,7 +344,7 @@ services:
343
344
ports:
344
345
- 80:80
345
346
- 88:88
346
- ` , useDefaultVPC )
347
+ ` , nil , useDefaultVPC )
347
348
lb := template .Resources ["LoadBalancer" ]
348
349
assert .Check (t , lb != nil )
349
350
loadBalancer := * lb .(* elasticloadbalancingv2.LoadBalancer )
@@ -359,7 +360,7 @@ networks:
359
360
default:
360
361
external: true
361
362
name: sg-123abc
362
- ` , useDefaultVPC , func (m * MockAPIMockRecorder ) {
363
+ ` , nil , useDefaultVPC , func (m * MockAPIMockRecorder ) {
363
364
m .SecurityGroupExists (gomock .Any (), "sg-123abc" ).Return (true , nil )
364
365
})
365
366
assert .Check (t , template .Resources ["DefaultNetwork" ] == nil )
@@ -378,7 +379,7 @@ volumes:
378
379
db-data:
379
380
external: true
380
381
name: fs-123abc
381
- ` , useDefaultVPC , func (m * MockAPIMockRecorder ) {
382
+ ` , nil , useDefaultVPC , func (m * MockAPIMockRecorder ) {
382
383
m .ResolveFileSystem (gomock .Any (), "fs-123abc" ).Return (existingAWSResource {id : "fs-123abc" }, nil )
383
384
})
384
385
s := template .Resources ["DbdataNFSMountTargetOnSubnet1" ].(* efs.MountTarget )
@@ -403,7 +404,7 @@ volumes:
403
404
performance_mode: maxIO
404
405
throughput_mode: provisioned
405
406
provisioned_throughput: 1024
406
- ` , useDefaultVPC , func (m * MockAPIMockRecorder ) {
407
+ ` , nil , useDefaultVPC , func (m * MockAPIMockRecorder ) {
407
408
m .ListFileSystems (gomock .Any (), map [string ]string {
408
409
api .ProjectLabel : t .Name (),
409
410
api .VolumeLabel : "db-data" ,
@@ -423,6 +424,25 @@ volumes:
423
424
assert .Equal (t , s .FileSystemId , cloudformation .Ref (n )) //nolint:staticcheck
424
425
}
425
426
427
+ func TestCreateSourcelessVolume (t * testing.T ) {
428
+ convertYaml (t , `
429
+ services:
430
+ test:
431
+ image: nginx
432
+ volumes:
433
+ - db-data
434
+ volumes:
435
+ db-data:
436
+ ` ,
437
+ errors .New ("service test has an invalid volume db-data: ECS does not support sourceless volumes" ),
438
+ useDefaultVPC , func (m * MockAPIMockRecorder ) {
439
+ m .ListFileSystems (gomock .Any (), map [string ]string {
440
+ api .ProjectLabel : t .Name (),
441
+ api .VolumeLabel : "db-data" ,
442
+ }).Return (nil , nil )
443
+ })
444
+ }
445
+
426
446
func TestCreateAccessPoint (t * testing.T ) {
427
447
template := convertYaml (t , `
428
448
services:
@@ -433,7 +453,7 @@ volumes:
433
453
driver_opts:
434
454
uid: 1002
435
455
gid: 1002
436
- ` , useDefaultVPC , func (m * MockAPIMockRecorder ) {
456
+ ` , nil , useDefaultVPC , func (m * MockAPIMockRecorder ) {
437
457
m .ListFileSystems (gomock .Any (), gomock .Any ()).Return (nil , nil )
438
458
})
439
459
a := template .Resources ["DbdataAccessPoint" ].(* efs.AccessPoint )
@@ -449,7 +469,7 @@ services:
449
469
image: nginx
450
470
volumes:
451
471
db-data: {}
452
- ` , useDefaultVPC , func (m * MockAPIMockRecorder ) {
472
+ ` , nil , useDefaultVPC , func (m * MockAPIMockRecorder ) {
453
473
m .ListFileSystems (gomock .Any (), map [string ]string {
454
474
api .ProjectLabel : t .Name (),
455
475
api .VolumeLabel : "db-data" ,
@@ -480,7 +500,7 @@ services:
480
500
init: true
481
501
user: "user"
482
502
working_dir: "working_dir"
483
- ` , useDefaultVPC )
503
+ ` , nil , useDefaultVPC )
484
504
def := template .Resources ["TestTaskDefinition" ].(* ecs.TaskDefinition )
485
505
container := getMainContainer (def , t )
486
506
assert .Equal (t , container .Image , "image" )
@@ -511,7 +531,7 @@ services:
511
531
ports:
512
532
- 80:80
513
533
- 88:88
514
- ` , useDefaultVPC )
534
+ ` , nil , useDefaultVPC )
515
535
for _ , r := range template .Resources {
516
536
tags := reflect .Indirect (reflect .ValueOf (r )).FieldByName ("Tags" )
517
537
if ! tags .IsValid () {
@@ -533,7 +553,7 @@ x-aws-cluster: "arn:aws:ecs:region:account:cluster/name"
533
553
services:
534
554
test:
535
555
image: nginx
536
- ` , useDefaultVPC , func (m * MockAPIMockRecorder ) {
556
+ ` , nil , useDefaultVPC , func (m * MockAPIMockRecorder ) {
537
557
m .ResolveCluster (gomock .Any (), "arn:aws:ecs:region:account:cluster/name" ).Return (existingAWSResource {
538
558
arn : "arn:aws:ecs:region:account:cluster/name" ,
539
559
id : "name" ,
@@ -548,7 +568,7 @@ x-aws-vpc: "arn:aws:ec2:us-west-1:EXAMPLE:vpc/vpc-1234acbd"
548
568
services:
549
569
test:
550
570
image: nginx
551
- ` , func (m * MockAPIMockRecorder ) {
571
+ ` , nil , func (m * MockAPIMockRecorder ) {
552
572
m .CheckVPC (gomock .Any (), "vpc-1234acbd" ).Return (nil )
553
573
m .GetSubNets (gomock .Any (), "vpc-1234acbd" ).Return ([]awsResource {
554
574
existingAWSResource {id : "subnet1" },
@@ -559,7 +579,7 @@ services:
559
579
})
560
580
}
561
581
562
- func convertYaml (t * testing.T , yaml string , fn ... func (m * MockAPIMockRecorder )) * cloudformation.Template {
582
+ func convertYaml (t * testing.T , yaml string , assertErr error , fn ... func (m * MockAPIMockRecorder )) * cloudformation.Template {
563
583
project := loadConfig (t , yaml )
564
584
ctrl := gomock .NewController (t )
565
585
defer ctrl .Finish ()
@@ -573,7 +593,12 @@ func convertYaml(t *testing.T, yaml string, fn ...func(m *MockAPIMockRecorder))
573
593
aws : m ,
574
594
}
575
595
template , err := backend .convert (context .TODO (), project )
576
- assert .NilError (t , err )
596
+ if assertErr == nil {
597
+ assert .NilError (t , err )
598
+ } else {
599
+ assert .Error (t , err , assertErr .Error ())
600
+ }
601
+
577
602
return template
578
603
}
579
604
0 commit comments