@@ -113,6 +113,8 @@ const (
113
113
taskCredentialsID = "taskCredentialsId"
114
114
endpointId = "endpointId"
115
115
networkNamespace = "/path"
116
+ hostNetworkNamespace = "host"
117
+ defaultIfname = "eth0"
116
118
117
119
port = 1234
118
120
protocol = "tcp"
@@ -270,6 +272,7 @@ var (
270
272
PullStoppedAtUnsafe : now ,
271
273
ExecutionStoppedAtUnsafe : now ,
272
274
LaunchType : "EC2" ,
275
+ NetworkMode : bridgeMode ,
273
276
}
274
277
container1 = & apicontainer.Container {
275
278
Name : containerName ,
@@ -404,6 +407,30 @@ var (
404
407
Type : containerType ,
405
408
},
406
409
}
410
+ expectedV4HostContainerResponse = v4.ContainerResponse {
411
+ ContainerResponse : & v2.ContainerResponse {
412
+ ID : containerID ,
413
+ Name : containerName ,
414
+ DockerName : containerName ,
415
+ Image : imageName ,
416
+ ImageID : imageID ,
417
+ DesiredStatus : statusRunning ,
418
+ KnownStatus : statusRunning ,
419
+ ContainerARN : "arn:aws:ecs:ap-northnorth-1:NNN:container/NNNNNNNN-aaaa-4444-bbbb-00000000000" ,
420
+ Limits : v2.LimitsResponse {
421
+ CPU : aws .Float64 (cpu ),
422
+ Memory : aws .Int64 (memory ),
423
+ },
424
+ Type : containerType ,
425
+ Labels : labels ,
426
+ Ports : []tmdsresponse.PortResponse {
427
+ {
428
+ ContainerPort : containerPort ,
429
+ Protocol : containerPortProtocol ,
430
+ },
431
+ },
432
+ },
433
+ }
407
434
expectedV4BridgeContainerResponse = v4ContainerResponseFromV2 (expectedBridgeContainerResponse , []v4.Network {{
408
435
Network : tmdsresponse.Network {
409
436
NetworkMode : bridgeMode ,
@@ -423,6 +450,7 @@ var (
423
450
task .FaultInjectionEnabled = faultInjectionEnabled
424
451
task .NetworkMode = networkMode
425
452
task .NetworkNamespace = networkNamespace
453
+ task .DefaultIfname = defaultIfname
426
454
gomock .InOrder (
427
455
state .EXPECT ().TaskARNByV3EndpointID (endpointId ).Return (taskARN , true ),
428
456
state .EXPECT ().TaskByArn (taskARN ).Return (task , true ).Times (2 ),
@@ -466,6 +494,13 @@ func standardTask() *apitask.Task {
466
494
return & task
467
495
}
468
496
497
+ func standardHostTask () * apitask.Task {
498
+ task := standardTask ()
499
+ task .ENIs = nil
500
+ task .NetworkMode = apitask .HostNetworkMode
501
+ return task
502
+ }
503
+
469
504
// Returns a standard v2 task response. This getter function protects against tests mutating the
470
505
// response.
471
506
func expectedTaskResponse () v2.TaskResponse {
@@ -524,6 +559,34 @@ func expectedV4TaskResponse() v4.TaskResponse {
524
559
)
525
560
}
526
561
562
+ func expectedV4TaskNetworkConfig (faultInjectionEnabled bool , networkMode , path , deviceName string ) * v4.TaskNetworkConfig {
563
+ return v4 .NewTaskNetworkConfig (networkMode , path , deviceName )
564
+ }
565
+
566
+ func expectedV4TaskResponseHostMode () v4.TaskResponse {
567
+ return v4TaskResponseFromV2 (
568
+ v2.TaskResponse {
569
+ Cluster : clusterName ,
570
+ TaskARN : taskARN ,
571
+ Family : family ,
572
+ Revision : version ,
573
+ DesiredStatus : statusRunning ,
574
+ KnownStatus : statusRunning ,
575
+ Limits : & v2.LimitsResponse {
576
+ CPU : aws .Float64 (cpu ),
577
+ Memory : aws .Int64 (memory ),
578
+ },
579
+ PullStartedAt : aws .Time (now .UTC ()),
580
+ PullStoppedAt : aws .Time (now .UTC ()),
581
+ ExecutionStoppedAt : aws .Time (now .UTC ()),
582
+ AvailabilityZone : availabilityzone ,
583
+ LaunchType : "EC2" ,
584
+ },
585
+ []v4.ContainerResponse {expectedV4HostContainerResponse },
586
+ vpcID ,
587
+ )
588
+ }
589
+
527
590
// Returns a standard v4 task response including pulled containers response. This getter function
528
591
// protects against tests mutating the response.
529
592
func expectedV4PulledTaskResponse () v4.TaskResponse {
@@ -1994,6 +2057,51 @@ func TestV4TaskMetadata(t *testing.T) {
1994
2057
expectedResponseBody : expectedV4PulledTaskResponse (),
1995
2058
})
1996
2059
})
2060
+
2061
+ t .Run ("happy case with fault injection enabled using awsvpc mode" , func (t * testing.T ) {
2062
+ testTMDSRequest (t , TMDSTestCase [v4.TaskResponse ]{
2063
+ path : v4BasePath + v3EndpointID + "/task" ,
2064
+ setStateExpectations : func (state * mock_dockerstate.MockTaskEngineState ) {
2065
+ task .FaultInjectionEnabled = true
2066
+ task .NetworkNamespace = networkNamespace
2067
+ task .DefaultIfname = defaultIfname
2068
+ gomock .InOrder (
2069
+ state .EXPECT ().TaskARNByV3EndpointID (v3EndpointID ).Return (taskARN , true ),
2070
+ state .EXPECT ().TaskByArn (taskARN ).Return (task , true ).Times (2 ),
2071
+ state .EXPECT ().ContainerByID (containerID ).Return (dockerContainer , true ).AnyTimes (),
2072
+ state .EXPECT ().ContainerMapByArn (taskARN ).Return (containerNameToDockerContainer , true ),
2073
+ state .EXPECT ().TaskByArn (taskARN ).Return (task , true ),
2074
+ state .EXPECT ().ContainerByID (containerID ).Return (dockerContainer , true ).AnyTimes (),
2075
+ state .EXPECT ().PulledContainerMapByArn (taskARN ).Return (nil , true ),
2076
+ )
2077
+ },
2078
+ expectedStatusCode : http .StatusOK ,
2079
+ expectedResponseBody : expectedV4TaskResponse (),
2080
+ })
2081
+ })
2082
+
2083
+ t .Run ("happy case with fault injection enabled using host mode" , func (t * testing.T ) {
2084
+ testTMDSRequest (t , TMDSTestCase [v4.TaskResponse ]{
2085
+ path : v4BasePath + v3EndpointID + "/task" ,
2086
+ setStateExpectations : func (state * mock_dockerstate.MockTaskEngineState ) {
2087
+ hostTask := standardHostTask ()
2088
+ hostTask .FaultInjectionEnabled = true
2089
+ hostTask .NetworkNamespace = networkNamespace
2090
+ hostTask .DefaultIfname = defaultIfname
2091
+ gomock .InOrder (
2092
+ state .EXPECT ().TaskARNByV3EndpointID (v3EndpointID ).Return (taskARN , true ),
2093
+ state .EXPECT ().TaskByArn (taskARN ).Return (hostTask , true ).Times (2 ),
2094
+ state .EXPECT ().ContainerMapByArn (taskARN ).Return (containerNameToDockerContainer , true ),
2095
+ state .EXPECT ().ContainerByID (containerID ).Return (nil , false ).AnyTimes (),
2096
+ state .EXPECT ().PulledContainerMapByArn (taskARN ).Return (nil , true ),
2097
+ state .EXPECT ().ContainerByID (containerID ).Return (nil , false ).AnyTimes (),
2098
+ )
2099
+ },
2100
+ expectedStatusCode : http .StatusOK ,
2101
+ expectedResponseBody : expectedV4TaskResponseHostMode (),
2102
+ })
2103
+ })
2104
+
1997
2105
t .Run ("bridge mode container not found" , func (t * testing.T ) {
1998
2106
testTMDSRequest (t , TMDSTestCase [v4.TaskResponse ]{
1999
2107
path : v4BasePath + v3EndpointID + "/task" ,
@@ -3804,3 +3912,84 @@ func testRegisterFaultHandler(t *testing.T, tcs []blackholePortFaultTestCase, me
3804
3912
})
3805
3913
}
3806
3914
}
3915
+
3916
+ func TestV4GetTaskMetadataWithTaskNetworkConfig (t * testing.T ) {
3917
+
3918
+ tcs := []struct {
3919
+ name string
3920
+ setStateExpectations func (state * mock_dockerstate.MockTaskEngineState )
3921
+ expectedTaskNetworkConfig * v4.TaskNetworkConfig
3922
+ }{
3923
+ {
3924
+ name : "happy case with awsvpc mode" ,
3925
+ setStateExpectations : func (state * mock_dockerstate.MockTaskEngineState ) {
3926
+ task := standardTask ()
3927
+ task .FaultInjectionEnabled = true
3928
+ task .NetworkNamespace = networkNamespace
3929
+ task .DefaultIfname = defaultIfname
3930
+ gomock .InOrder (
3931
+ state .EXPECT ().TaskARNByV3EndpointID (v3EndpointID ).Return (taskARN , true ),
3932
+ state .EXPECT ().TaskByArn (taskARN ).Return (task , true ).Times (2 ),
3933
+ state .EXPECT ().ContainerByID (containerID ).Return (dockerContainer , true ).AnyTimes (),
3934
+ state .EXPECT ().ContainerMapByArn (taskARN ).Return (containerNameToDockerContainer , true ),
3935
+ state .EXPECT ().TaskByArn (taskARN ).Return (task , true ),
3936
+ state .EXPECT ().ContainerByID (containerID ).Return (dockerContainer , true ).AnyTimes (),
3937
+ state .EXPECT ().PulledContainerMapByArn (taskARN ).Return (nil , true ),
3938
+ )
3939
+ },
3940
+ expectedTaskNetworkConfig : expectedV4TaskNetworkConfig (true , apitask .AWSVPCNetworkMode , networkNamespace , defaultIfname ),
3941
+ },
3942
+ {
3943
+ name : "happy case with host mode" ,
3944
+ setStateExpectations : func (state * mock_dockerstate.MockTaskEngineState ) {
3945
+ hostTask := standardHostTask ()
3946
+ hostTask .FaultInjectionEnabled = true
3947
+ hostTask .NetworkNamespace = networkNamespace
3948
+ hostTask .DefaultIfname = defaultIfname
3949
+ gomock .InOrder (
3950
+ state .EXPECT ().TaskARNByV3EndpointID (v3EndpointID ).Return (taskARN , true ),
3951
+ state .EXPECT ().TaskByArn (taskARN ).Return (hostTask , true ).Times (2 ),
3952
+ state .EXPECT ().ContainerMapByArn (taskARN ).Return (containerNameToDockerContainer , true ),
3953
+ state .EXPECT ().ContainerByID (containerID ).Return (nil , false ).AnyTimes (),
3954
+ state .EXPECT ().PulledContainerMapByArn (taskARN ).Return (nil , true ),
3955
+ state .EXPECT ().ContainerByID (containerID ).Return (nil , false ).AnyTimes (),
3956
+ )
3957
+ },
3958
+ expectedTaskNetworkConfig : expectedV4TaskNetworkConfig (true , apitask .HostNetworkMode , hostNetworkNamespace , defaultIfname ),
3959
+ },
3960
+ {
3961
+ name : "happy bridge mode" ,
3962
+ setStateExpectations : func (state * mock_dockerstate.MockTaskEngineState ) {
3963
+ gomock .InOrder (
3964
+ state .EXPECT ().TaskARNByV3EndpointID (v3EndpointID ).Return (taskARN , true ),
3965
+ state .EXPECT ().TaskByArn (taskARN ).Return (bridgeTask , true ).Times (2 ),
3966
+ state .EXPECT ().ContainerMapByArn (taskARN ).Return (containerNameToBridgeContainer , true ),
3967
+ state .EXPECT ().ContainerByID (containerID ).Return (bridgeContainer , true ).AnyTimes (),
3968
+ state .EXPECT ().PulledContainerMapByArn (taskARN ).Return (nil , true ),
3969
+ state .EXPECT ().ContainerByID (containerID ).Return (bridgeContainer , true ).AnyTimes (),
3970
+ )
3971
+ },
3972
+ expectedTaskNetworkConfig : expectedV4TaskNetworkConfig (true , bridgeMode , "" , "" ),
3973
+ },
3974
+ }
3975
+
3976
+ for _ , tc := range tcs {
3977
+ t .Run (tc .name , func (t * testing.T ) {
3978
+ ctrl := gomock .NewController (t )
3979
+ defer ctrl .Finish ()
3980
+
3981
+ state := mock_dockerstate .NewMockTaskEngineState (ctrl )
3982
+ statsEngine := mock_stats .NewMockEngine (ctrl )
3983
+ ecsClient := mock_ecs .NewMockECSClient (ctrl )
3984
+
3985
+ if tc .setStateExpectations != nil {
3986
+ tc .setStateExpectations (state )
3987
+ }
3988
+ tmdsAgentState := agentV4 .NewTMDSAgentState (state , statsEngine , ecsClient , clusterName , availabilityzone , vpcID , containerInstanceArn )
3989
+ actualTaskResponse , err := tmdsAgentState .GetTaskMetadata (v3EndpointID )
3990
+
3991
+ assert .NoError (t , err )
3992
+ assert .Equal (t , tc .expectedTaskNetworkConfig , actualTaskResponse .TaskNetworkConfig )
3993
+ })
3994
+ }
3995
+ }
0 commit comments