Skip to content

Commit 5a34a13

Browse files
committed
Attempt to clean up CF IAM users
Periodic tests seemed to get into a failure loop because an IAM user with the same name already existed, which is not allowed. This then failed the entire CloudFoundation stack. Depite the stack claiming to have been rolled back, the next iteration would run into the same problem. This change includes IAM users in the list of resources we need to specifically delete in the case of a CloudFoundation failure, just in case they've leaked Signed-off-by: Nolan Brubaker <[email protected]>
1 parent dc86e24 commit 5a34a13

File tree

1 file changed

+35
-0
lines changed

1 file changed

+35
-0
lines changed

test/e2e/shared/aws.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,7 @@ func deleteResourcesInCloudFormation(prov client.ConfigProvider, t *cfn_bootstra
474474
iamSvc := iam.New(prov)
475475
temp := *renderCustomCloudFormation(t)
476476
var (
477+
iamUsers []*cfn_iam.User
477478
iamRoles []*cfn_iam.Role
478479
instanceProfiles []*cfn_iam.InstanceProfile
479480
policies []*cfn_iam.ManagedPolicy
@@ -484,6 +485,9 @@ func deleteResourcesInCloudFormation(prov client.ConfigProvider, t *cfn_bootstra
484485
// temp.Resources is a map. Traversing that directly results in undetermined order.
485486
for _, val := range temp.Resources {
486487
switch val.AWSCloudFormationType() {
488+
case configservice.ResourceTypeAwsIamUser:
489+
user := val.(*cfn_iam.User)
490+
iamUsers = append(iamUsers, user)
487491
case configservice.ResourceTypeAwsIamRole:
488492
role := val.(*cfn_iam.Role)
489493
iamRoles = append(iamRoles, role)
@@ -498,6 +502,19 @@ func deleteResourcesInCloudFormation(prov client.ConfigProvider, t *cfn_bootstra
498502
groups = append(groups, group)
499503
}
500504
}
505+
for _, user := range iamUsers {
506+
By(fmt.Sprintf("deleting the following user: %q", user.UserName))
507+
repeat := false
508+
Eventually(func(gomega Gomega) bool {
509+
err := DeleteUser(prov, user.UserName)
510+
if err != nil && !repeat {
511+
By(fmt.Sprintf("failed to delete user '%q'; reason: %+v", user.UserName, err))
512+
repeat = true
513+
}
514+
code, ok := awserrors.Code(err)
515+
return err == nil || (ok && code == iam.ErrCodeNoSuchEntityException)
516+
}, 5*time.Minute, 5*time.Second).Should(BeTrue(), fmt.Sprintf("Eventually failed deleting the user: %q", user.UserName))
517+
}
501518
for _, role := range iamRoles {
502519
By(fmt.Sprintf("deleting the following role: %s", role.RoleName))
503520
repeat := false
@@ -598,6 +615,24 @@ func detachAllPoliciesForRole(prov client.ConfigProvider, name string) error {
598615
return nil
599616
}
600617

618+
// DeleteUser deletes an IAM user in a best effort manner.
619+
func DeleteUser(prov client.ConfigProvider, name string) error {
620+
iamSvc := iam.New(prov)
621+
622+
// if role does not exist, return.
623+
_, err := iamSvc.GetUser(&iam.GetUserInput{UserName: aws.String(name)})
624+
if err != nil {
625+
return err
626+
}
627+
628+
_, err = iamSvc.DeleteUser(&iam.DeleteUserInput{UserName: aws.String(name)})
629+
if err != nil {
630+
return err
631+
}
632+
633+
return nil
634+
}
635+
601636
// DeleteRole deletes roles in a best effort manner.
602637
func DeleteRole(prov client.ConfigProvider, name string) error {
603638
iamSvc := iam.New(prov)

0 commit comments

Comments
 (0)