Skip to content
This repository was archived by the owner on Oct 15, 2024. It is now read-only.

Add elasticache user and group support #1044

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions resources/elasticache-subnetgroups.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package resources

import (
"fmt"
"strings"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/elasticache"
Expand Down Expand Up @@ -35,6 +38,13 @@ func ListElasticacheSubnetGroups(sess *session.Session) ([]Resource, error) {
return resources, nil
}

func (i *ElasticacheSubnetGroup) Filter() error {
if strings.HasPrefix(*i.name, "default") {
return fmt.Errorf("Cannot delete default subnet group")
}
return nil
}

func (i *ElasticacheSubnetGroup) Remove() error {
params := &elasticache.DeleteCacheSubnetGroupInput{
CacheSubnetGroupName: i.name,
Expand Down
74 changes: 74 additions & 0 deletions resources/elasticache-usergroups.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
package resources

import (
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/elasticache"
"github.com/rebuy-de/aws-nuke/v2/pkg/types"
)

type ElasticacheUserGroup struct {
svc *elasticache.ElastiCache
groupId *string
}

func init() {
register("ElasticacheUserGroup", ListElasticacheUserGroups)
}

func ListElasticacheUserGroups(sess *session.Session) ([]Resource, error) {
svc := elasticache.New(sess)
resources := []Resource{}
var nextToken *string

for {
params := &elasticache.DescribeUserGroupsInput{
MaxRecords: aws.Int64(100),
Marker: nextToken,
}
resp, err := svc.DescribeUserGroups(params)
if err != nil {
return nil, err
}

for _, userGroup := range resp.UserGroups {
resources = append(resources, &ElasticacheUserGroup{
svc: svc,
groupId: userGroup.UserGroupId,
})
}

// Check if there are more results
if resp.Marker == nil {
break // No more results, exit the loop
}

// Set the nextToken for the next iteration
nextToken = resp.Marker
}

return resources, nil
}

func (i *ElasticacheUserGroup) Remove() error {
params := &elasticache.DeleteUserGroupInput{
UserGroupId: i.groupId,
}

_, err := i.svc.DeleteUserGroup(params)
if err != nil {
return err
}

return nil
}

func (i *ElasticacheUserGroup) Properties() types.Properties {
properties := types.NewProperties()
properties.Set("ID", i.groupId)
return properties
}

func (i *ElasticacheUserGroup) String() string {
return *i.groupId
}
Comment on lines +72 to +74
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry for the late reply - would you mind adding properties for both resources as well?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@der-eismann I have added properties to both resources. Are these sufficient or are there additional properties you would like to see?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No these are fine, thanks!

87 changes: 87 additions & 0 deletions resources/elasticache-users.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package resources

import (
"fmt"
"strings"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/aws/aws-sdk-go/service/elasticache"
"github.com/rebuy-de/aws-nuke/v2/pkg/types"
)

type ElasticacheUser struct {
svc *elasticache.ElastiCache
userId *string
userName *string
}

func init() {
register("ElasticacheUser", ListElasticacheUsers)
}

func ListElasticacheUsers(sess *session.Session) ([]Resource, error) {
svc := elasticache.New(sess)
resources := []Resource{}
var nextToken *string

for {
params := &elasticache.DescribeUsersInput{
MaxRecords: aws.Int64(100),
Marker: nextToken,
}
resp, err := svc.DescribeUsers(params)
if err != nil {
return nil, err
}

for _, user := range resp.Users {
resources = append(resources, &ElasticacheUser{
svc: svc,
userId: user.UserId,
userName: user.UserName,
})
}

// Check if there are more results
if resp.Marker == nil {
break // No more results, exit the loop
}

// Set the nextToken for the next iteration
nextToken = resp.Marker
}

return resources, nil
}

func (i *ElasticacheUser) Filter() error {
if strings.HasPrefix(*i.userName, "default") {
return fmt.Errorf("cannot delete default user")
}
return nil
}

func (i *ElasticacheUser) Remove() error {
params := &elasticache.DeleteUserInput{
UserId: i.userId,
}

_, err := i.svc.DeleteUser(params)
if err != nil {
return err
}

return nil
}

func (i *ElasticacheUser) Properties() types.Properties {
properties := types.NewProperties()
properties.Set("ID", i.userId)
properties.Set("UserName", i.userName)
return properties
}

func (i *ElasticacheUser) String() string {
return *i.userId
}