Skip to content

Commit 3e480fb

Browse files
authored
Merge pull request #5242 from nrb/clean-up-cf-user
🐛 Attempt to clean up CF IAM users
2 parents 0b6b8a6 + 5a34a13 commit 3e480fb

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
@@ -475,6 +475,7 @@ func deleteResourcesInCloudFormation(prov client.ConfigProvider, t *cfn_bootstra
475475
iamSvc := iam.New(prov)
476476
temp := *renderCustomCloudFormation(t)
477477
var (
478+
iamUsers []*cfn_iam.User
478479
iamRoles []*cfn_iam.Role
479480
instanceProfiles []*cfn_iam.InstanceProfile
480481
policies []*cfn_iam.ManagedPolicy
@@ -485,6 +486,9 @@ func deleteResourcesInCloudFormation(prov client.ConfigProvider, t *cfn_bootstra
485486
// temp.Resources is a map. Traversing that directly results in undetermined order.
486487
for _, val := range temp.Resources {
487488
switch val.AWSCloudFormationType() {
489+
case configservice.ResourceTypeAwsIamUser:
490+
user := val.(*cfn_iam.User)
491+
iamUsers = append(iamUsers, user)
488492
case configservice.ResourceTypeAwsIamRole:
489493
role := val.(*cfn_iam.Role)
490494
iamRoles = append(iamRoles, role)
@@ -499,6 +503,19 @@ func deleteResourcesInCloudFormation(prov client.ConfigProvider, t *cfn_bootstra
499503
groups = append(groups, group)
500504
}
501505
}
506+
for _, user := range iamUsers {
507+
By(fmt.Sprintf("deleting the following user: %q", user.UserName))
508+
repeat := false
509+
Eventually(func(gomega Gomega) bool {
510+
err := DeleteUser(prov, user.UserName)
511+
if err != nil && !repeat {
512+
By(fmt.Sprintf("failed to delete user '%q'; reason: %+v", user.UserName, err))
513+
repeat = true
514+
}
515+
code, ok := awserrors.Code(err)
516+
return err == nil || (ok && code == iam.ErrCodeNoSuchEntityException)
517+
}, 5*time.Minute, 5*time.Second).Should(BeTrue(), fmt.Sprintf("Eventually failed deleting the user: %q", user.UserName))
518+
}
502519
for _, role := range iamRoles {
503520
By(fmt.Sprintf("deleting the following role: %s", role.RoleName))
504521
repeat := false
@@ -599,6 +616,24 @@ func detachAllPoliciesForRole(prov client.ConfigProvider, name string) error {
599616
return nil
600617
}
601618

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

0 commit comments

Comments
 (0)