@@ -760,6 +760,7 @@ func TestNewTaskEngineRestoreFromCheckpointNewStateManagerError(t *testing.T) {
760
760
761
761
ec2MetadataClient := mock_ec2 .NewMockEC2MetadataClient (ctrl )
762
762
mockPauseLoader := mock_loader .NewMockLoader (ctrl )
763
+ newError := errors .New ("error" )
763
764
gomock .InOrder (
764
765
saveableOptionFactory .EXPECT ().AddSaveable ("TaskEngine" , gomock .Any ()).Return (nil ),
765
766
saveableOptionFactory .EXPECT ().AddSaveable ("ContainerInstanceArn" , gomock .Any ()).Return (nil ),
@@ -770,7 +771,7 @@ func TestNewTaskEngineRestoreFromCheckpointNewStateManagerError(t *testing.T) {
770
771
771
772
stateManagerFactory .EXPECT ().NewStateManager (gomock .Any (), gomock .Any (),
772
773
gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any ()).Return (
773
- nil , errors . New ( "error" ) ),
774
+ nil , newError ),
774
775
)
775
776
776
777
dataClient := newTestDataClient (t )
@@ -795,7 +796,6 @@ func TestNewTaskEngineRestoreFromCheckpointNewStateManagerError(t *testing.T) {
795
796
_ , _ , err := agent .newTaskEngine (eventstream .NewEventStream ("events" , ctx ),
796
797
credentialsManager , dockerstate .NewTaskEngineState (), imageManager , hostResources , execCmdMgr , serviceConnectManager , daemonManagers )
797
798
assert .Error (t , err )
798
- assert .False (t , isTransient (err ))
799
799
}
800
800
801
801
func TestNewTaskEngineRestoreFromCheckpointStateLoadError (t * testing.T ) {
@@ -808,6 +808,7 @@ func TestNewTaskEngineRestoreFromCheckpointStateLoadError(t *testing.T) {
808
808
cfg .Checkpoint = config.BooleanDefaultFalse {Value : config .ExplicitlyEnabled }
809
809
ec2MetadataClient := mock_ec2 .NewMockEC2MetadataClient (ctrl )
810
810
mockPauseLoader := mock_loader .NewMockLoader (ctrl )
811
+ newError := errors .New ("error" )
811
812
812
813
gomock .InOrder (
813
814
saveableOptionFactory .EXPECT ().AddSaveable ("TaskEngine" , gomock .Any ()).Return (nil ),
@@ -819,7 +820,7 @@ func TestNewTaskEngineRestoreFromCheckpointStateLoadError(t *testing.T) {
819
820
stateManagerFactory .EXPECT ().NewStateManager (gomock .Any (),
820
821
gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any (),
821
822
).Return (stateManager , nil ),
822
- stateManager .EXPECT ().Load ().Return (errors . New ( "error" ) ),
823
+ stateManager .EXPECT ().Load ().Return (newError ),
823
824
)
824
825
825
826
dataClient := newTestDataClient (t )
@@ -844,7 +845,6 @@ func TestNewTaskEngineRestoreFromCheckpointStateLoadError(t *testing.T) {
844
845
_ , _ , err := agent .newTaskEngine (eventstream .NewEventStream ("events" , ctx ),
845
846
credentialsManager , dockerstate .NewTaskEngineState (), imageManager , hostResources , execCmdMgr , serviceConnectManager , daemonManagers )
846
847
assert .Error (t , err )
847
- assert .False (t , isTransient (err ))
848
848
}
849
849
850
850
func TestNewTaskEngineRestoreFromCheckpoint (t * testing.T ) {
@@ -1086,7 +1086,7 @@ func TestReregisterContainerInstanceInstanceTypeChanged(t *testing.T) {
1086
1086
1087
1087
err := agent .registerContainerInstance (client , nil )
1088
1088
assert .Error (t , err )
1089
- assert .False (t , isTransient (err ))
1089
+ assert .True (t , isTerminal (err ))
1090
1090
}
1091
1091
1092
1092
func TestReregisterContainerInstanceAttributeError (t * testing.T ) {
@@ -1145,7 +1145,7 @@ func TestReregisterContainerInstanceAttributeError(t *testing.T) {
1145
1145
1146
1146
err := agent .registerContainerInstance (client , nil )
1147
1147
assert .Error (t , err )
1148
- assert .False (t , isTransient (err ))
1148
+ assert .True (t , isTerminal (err ))
1149
1149
}
1150
1150
1151
1151
func TestReregisterContainerInstanceNonTerminalError (t * testing.T ) {
@@ -1204,7 +1204,66 @@ func TestReregisterContainerInstanceNonTerminalError(t *testing.T) {
1204
1204
1205
1205
err := agent .registerContainerInstance (client , nil )
1206
1206
assert .Error (t , err )
1207
- assert .True (t , isTransient (err ))
1207
+ assert .False (t , isTerminal (err ))
1208
+ }
1209
+
1210
+ func TestReregisterContainerInstanceTerminalError (t * testing.T ) {
1211
+ ctrl := gomock .NewController (t )
1212
+ defer ctrl .Finish ()
1213
+
1214
+ mockDockerClient := mock_dockerapi .NewMockDockerClient (ctrl )
1215
+ client := mock_ecs .NewMockECSClient (ctrl )
1216
+ mockCredentialsProvider := app_mocks .NewMockCredentialsProvider (ctrl )
1217
+ mockMobyPlugins := mock_mobypkgwrapper .NewMockPlugins (ctrl )
1218
+ mockEC2Metadata := mock_ec2 .NewMockEC2MetadataClient (ctrl )
1219
+ mockPauseLoader := mock_loader .NewMockLoader (ctrl )
1220
+
1221
+ mockPauseLoader .EXPECT ().IsLoaded (gomock .Any ()).Return (false , nil ).AnyTimes ()
1222
+ mockPauseLoader .EXPECT ().LoadImage (gomock .Any (), gomock .Any (), gomock .Any ()).Return (nil , nil ).AnyTimes ()
1223
+ mockServiceConnectManager := mock_serviceconnect .NewMockManager (ctrl )
1224
+ mockServiceConnectManager .EXPECT ().IsLoaded (gomock .Any ()).Return (true , nil ).AnyTimes ()
1225
+ mockServiceConnectManager .EXPECT ().GetLoadedAppnetVersion ().AnyTimes ()
1226
+ mockServiceConnectManager .EXPECT ().GetCapabilitiesForAppnetInterfaceVersion ("" ).AnyTimes ()
1227
+ mockServiceConnectManager .EXPECT ().SetECSClient (gomock .Any (), gomock .Any ()).AnyTimes ()
1228
+
1229
+ mockDaemonManager := mock_daemonmanager .NewMockDaemonManager (ctrl )
1230
+ mockDaemonManagers := map [string ]dm.DaemonManager {md .EbsCsiDriver : mockDaemonManager }
1231
+ mockDaemonManager .EXPECT ().IsLoaded (gomock .Any ()).Return (true , nil ).AnyTimes ()
1232
+ mockDaemonManager .EXPECT ().LoadImage (gomock .Any (), gomock .Any ()).Return (nil , nil ).AnyTimes ()
1233
+
1234
+ gomock .InOrder (
1235
+ mockCredentialsProvider .EXPECT ().Retrieve (gomock .Any ()).Return (awsv2.Credentials {}, nil ),
1236
+ mockDockerClient .EXPECT ().SupportedVersions ().Return (apiVersions ),
1237
+ mockMobyPlugins .EXPECT ().Scan ().AnyTimes ().Return ([]string {}, nil ),
1238
+ mockDockerClient .EXPECT ().ListPluginsWithFilters (gomock .Any (), gomock .Any (),
1239
+ gomock .Any (), gomock .Any ()).AnyTimes ().Return ([]string {}, nil ),
1240
+ client .EXPECT ().RegisterContainerInstance (containerInstanceARN , gomock .Any (), gomock .Any (), gomock .Any (),
1241
+ gomock .Any (), gomock .Any ()).Return ("" , "" , awserr .New ("ClientException" , "" , nil )),
1242
+ )
1243
+ mockEC2Metadata .EXPECT ().OutpostARN ().Return ("" , nil )
1244
+
1245
+ cfg := getTestConfig ()
1246
+ cfg .Cluster = clusterName
1247
+ ctx , cancel := context .WithCancel (context .TODO ())
1248
+ // Cancel the context to cancel async routines
1249
+ defer cancel ()
1250
+ agent := & ecsAgent {
1251
+ ctx : ctx ,
1252
+ cfg : & cfg ,
1253
+ dockerClient : mockDockerClient ,
1254
+ ec2MetadataClient : mockEC2Metadata ,
1255
+ pauseLoader : mockPauseLoader ,
1256
+ credentialsCache : awsv2 .NewCredentialsCache (mockCredentialsProvider ),
1257
+ mobyPlugins : mockMobyPlugins ,
1258
+ serviceconnectManager : mockServiceConnectManager ,
1259
+ daemonManagers : mockDaemonManagers ,
1260
+ }
1261
+ agent .containerInstanceARN = containerInstanceARN
1262
+ agent .availabilityZone = availabilityZone
1263
+
1264
+ err := agent .registerContainerInstance (client , nil )
1265
+ assert .Error (t , err )
1266
+ assert .True (t , isTerminal (err ))
1208
1267
}
1209
1268
1210
1269
func TestRegisterContainerInstanceWhenContainerInstanceARNIsNotSetHappyPath (t * testing.T ) {
@@ -1320,7 +1379,7 @@ func TestRegisterContainerInstanceWhenContainerInstanceARNIsNotSetCanRetryError(
1320
1379
1321
1380
err := agent .registerContainerInstance (client , nil )
1322
1381
assert .Error (t , err )
1323
- assert .True (t , isTransient (err ))
1382
+ assert .False (t , isTerminal (err ))
1324
1383
}
1325
1384
1326
1385
func TestRegisterContainerInstanceWhenContainerInstanceARNIsNotSetCannotRetryError (t * testing.T ) {
@@ -1378,7 +1437,7 @@ func TestRegisterContainerInstanceWhenContainerInstanceARNIsNotSetCannotRetryErr
1378
1437
1379
1438
err := agent .registerContainerInstance (client , nil )
1380
1439
assert .Error (t , err )
1381
- assert .False (t , isTransient (err ))
1440
+ assert .True (t , isTerminal (err ))
1382
1441
}
1383
1442
1384
1443
func TestRegisterContainerInstanceWhenContainerInstanceARNIsNotSetAttributeError (t * testing.T ) {
@@ -1435,7 +1494,7 @@ func TestRegisterContainerInstanceWhenContainerInstanceARNIsNotSetAttributeError
1435
1494
1436
1495
err := agent .registerContainerInstance (client , nil )
1437
1496
assert .Error (t , err )
1438
- assert .False (t , isTransient (err ))
1497
+ assert .True (t , isTerminal (err ))
1439
1498
}
1440
1499
1441
1500
func TestRegisterContainerInstanceInvalidParameterTerminalError (t * testing.T ) {
@@ -1499,6 +1558,114 @@ func TestRegisterContainerInstanceInvalidParameterTerminalError(t *testing.T) {
1499
1558
credentialsManager , state , imageManager , client , execCmdMgr )
1500
1559
assert .Equal (t , exitcodes .ExitTerminal , exitCode )
1501
1560
}
1561
+
1562
+ func TestRegisterContainerInstanceExceptionErrors (t * testing.T ) {
1563
+ testCases := []struct {
1564
+ name string
1565
+ regError error
1566
+ exitCode int
1567
+ }{
1568
+ {
1569
+ name : "InvalidParameterException" ,
1570
+ regError : awserr .New ("InvalidParameterException" , "" , nil ),
1571
+ exitCode : exitcodes .ExitTerminal ,
1572
+ },
1573
+ {
1574
+ name : "ClientException" ,
1575
+ regError : awserr .New ("ClientException" , "" , nil ),
1576
+ exitCode : exitcodes .ExitTerminal ,
1577
+ },
1578
+ {
1579
+ name : "ThrottlingException" ,
1580
+ regError : awserr .New ("ThrottlingException" , "" , nil ),
1581
+ exitCode : exitcodes .ExitError ,
1582
+ },
1583
+ }
1584
+
1585
+ for _ , tc := range testCases {
1586
+ t .Run (tc .name , func (t * testing.T ) {
1587
+ ctrl , credentialsManager , state , imageManager , client ,
1588
+ dockerClient , _ , _ , execCmdMgr , _ := setup (t )
1589
+ defer ctrl .Finish ()
1590
+
1591
+ mockCredentialsProvider := app_mocks .NewMockCredentialsProvider (ctrl )
1592
+ mockMobyPlugins := mock_mobypkgwrapper .NewMockPlugins (ctrl )
1593
+ mockEC2Metadata := mock_ec2 .NewMockEC2MetadataClient (ctrl )
1594
+ mockPauseLoader := mock_loader .NewMockLoader (ctrl )
1595
+ mockServiceConnectManager := mock_serviceconnect .NewMockManager (ctrl )
1596
+ mockDaemonManager := mock_daemonmanager .NewMockDaemonManager (ctrl )
1597
+ mockDaemonManagers := map [string ]dm.DaemonManager {md .EbsCsiDriver : mockDaemonManager }
1598
+
1599
+ mockPauseLoader .EXPECT ().IsLoaded (gomock .Any ()).Return (false , nil ).AnyTimes ()
1600
+ mockPauseLoader .EXPECT ().LoadImage (gomock .Any (), gomock .Any (), gomock .Any ()).Return (nil , nil ).AnyTimes ()
1601
+
1602
+ mockEC2Metadata .EXPECT ().PrimaryENIMAC ().Return ("mac" , nil )
1603
+ mockEC2Metadata .EXPECT ().VPCID ("mac" ).Return ("vpc-id" , nil )
1604
+ mockEC2Metadata .EXPECT ().SubnetID ("mac" ).Return ("subnet-id" , nil )
1605
+ mockEC2Metadata .EXPECT ().OutpostARN ().Return ("" , nil )
1606
+
1607
+ mockServiceConnectManager .EXPECT ().IsLoaded (gomock .Any ()).Return (true , nil ).AnyTimes ()
1608
+ mockServiceConnectManager .EXPECT ().GetLoadedAppnetVersion ().AnyTimes ()
1609
+ mockServiceConnectManager .EXPECT ().GetCapabilitiesForAppnetInterfaceVersion ("" ).AnyTimes ()
1610
+ mockServiceConnectManager .EXPECT ().SetECSClient (gomock .Any (), gomock .Any ()).AnyTimes ()
1611
+
1612
+ mockDaemonManager .EXPECT ().IsLoaded (gomock .Any ()).Return (true , nil ).AnyTimes ()
1613
+ mockDaemonManager .EXPECT ().LoadImage (gomock .Any (), gomock .Any ()).Return (nil , nil ).AnyTimes ()
1614
+
1615
+ dockerClient .EXPECT ().SupportedVersions ().Return (apiVersions ).AnyTimes ()
1616
+
1617
+ gomock .InOrder (
1618
+ client .EXPECT ().GetHostResources ().Return (testHostResource , nil ),
1619
+ mockCredentialsProvider .EXPECT ().Retrieve (gomock .Any ()).Return (awsv2.Credentials {}, nil ),
1620
+ mockMobyPlugins .EXPECT ().Scan ().AnyTimes ().Return ([]string {}, nil ),
1621
+ dockerClient .EXPECT ().ListPluginsWithFilters (gomock .Any (), gomock .Any (), gomock .Any (),
1622
+ gomock .Any ()).AnyTimes ().Return ([]string {}, nil ),
1623
+
1624
+ client .EXPECT ().
1625
+ RegisterContainerInstance (
1626
+ gomock .Any (), gomock .Any (), gomock .Any (), gomock .Any (),
1627
+ gomock .Any (), gomock .Any (),
1628
+ ).
1629
+ Return ("" , "" , tc .regError ),
1630
+ )
1631
+
1632
+ cfg := getTestConfig ()
1633
+ ctx , cancel := context .WithCancel (context .TODO ())
1634
+ defer cancel ()
1635
+
1636
+ agent := & ecsAgent {
1637
+ ctx : ctx ,
1638
+ ec2MetadataClient : mockEC2Metadata ,
1639
+ cfg : & cfg ,
1640
+ pauseLoader : mockPauseLoader ,
1641
+ credentialsCache : awsv2 .NewCredentialsCache (mockCredentialsProvider ),
1642
+ dockerClient : dockerClient ,
1643
+ mobyPlugins : mockMobyPlugins ,
1644
+ terminationHandler : func (
1645
+ taskEngineState dockerstate.TaskEngineState ,
1646
+ dataClient data.Client ,
1647
+ taskEngine engine.TaskEngine ,
1648
+ cancel context.CancelFunc ,
1649
+ ) {
1650
+ },
1651
+ serviceconnectManager : mockServiceConnectManager ,
1652
+ daemonManagers : mockDaemonManagers ,
1653
+ }
1654
+
1655
+ exitCode := agent .doStart (
1656
+ eventstream .NewEventStream ("events" , ctx ),
1657
+ credentialsManager ,
1658
+ state ,
1659
+ imageManager ,
1660
+ client ,
1661
+ execCmdMgr ,
1662
+ )
1663
+
1664
+ assert .Equal (t , tc .exitCode , exitCode )
1665
+ })
1666
+ }
1667
+ }
1668
+
1502
1669
func TestMergeTags (t * testing.T ) {
1503
1670
ec2Key := "ec2Key"
1504
1671
ec2Value := "ec2Value"
0 commit comments