From 3852d8a05a533ca9a865b00386e46d63726b5a84 Mon Sep 17 00:00:00 2001 From: Erik Kristensen Date: Sat, 31 Aug 2024 14:00:41 -0600 Subject: [PATCH 1/3] feat(resourcegroups-group): add filter for managed, add properties --- ...oups-groups.go => resourcegroups-group.go} | 52 +++++++++++++++---- 1 file changed, 42 insertions(+), 10 deletions(-) rename resources/{resourcegroups-groups.go => resourcegroups-group.go} (50%) diff --git a/resources/resourcegroups-groups.go b/resources/resourcegroups-group.go similarity index 50% rename from resources/resourcegroups-groups.go rename to resources/resourcegroups-group.go index 106161aa..077f4884 100644 --- a/resources/resourcegroups-groups.go +++ b/resources/resourcegroups-group.go @@ -2,6 +2,10 @@ package resources import ( "context" + "fmt" + "github.com/ekristen/libnuke/pkg/types" + "github.com/gotidy/ptr" + "github.com/sirupsen/logrus" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/resourcegroups" @@ -38,10 +42,23 @@ func (l *ResourceGroupGroupLister) List(_ context.Context, o interface{}) ([]res } for _, group := range output.GroupIdentifiers { - resources = append(resources, &ResourceGroupGroup{ - svc: svc, - groupName: group.GroupName, + tags, err := svc.GetTags(&resourcegroups.GetTagsInput{ + Arn: group.GroupArn, }) + if err != nil { + logrus.WithError(err).Error("unable to get tags for resource group") + } + + newResource := &ResourceGroupGroup{ + svc: svc, + Name: group.GroupName, + } + + if tags != nil { + newResource.Tags = tags.Tags + } + + resources = append(resources, newResource) } if output.NextToken == nil { @@ -55,18 +72,33 @@ func (l *ResourceGroupGroupLister) List(_ context.Context, o interface{}) ([]res } type ResourceGroupGroup struct { - svc *resourcegroups.ResourceGroups - groupName *string + svc *resourcegroups.ResourceGroups + Name *string + Tags map[string]*string +} + +func (r *ResourceGroupGroup) Filter() error { + for k, v := range r.Tags { + if k == "EnableAWSServiceCatalogAppRegistry" && ptr.ToString(v) == "true" { + return fmt.Errorf("cannot delete AWS managed resource group") + } + } + + return nil +} + +func (r *ResourceGroupGroup) Properties() types.Properties { + return types.NewPropertiesFromStruct(r) } -func (f *ResourceGroupGroup) Remove(_ context.Context) error { - _, err := f.svc.DeleteGroup(&resourcegroups.DeleteGroupInput{ - Group: f.groupName, +func (r *ResourceGroupGroup) Remove(_ context.Context) error { + _, err := r.svc.DeleteGroup(&resourcegroups.DeleteGroupInput{ + Group: r.Name, }) return err } -func (f *ResourceGroupGroup) String() string { - return *f.groupName +func (r *ResourceGroupGroup) String() string { + return *r.Name } From 0d3e253d1904a49977fb459621bf558bb0f9e27f Mon Sep 17 00:00:00 2001 From: Erik Kristensen Date: Sat, 31 Aug 2024 14:31:24 -0600 Subject: [PATCH 2/3] feat(resource): add appregistry application resource --- resources/appregistry-application.go | 88 ++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 resources/appregistry-application.go diff --git a/resources/appregistry-application.go b/resources/appregistry-application.go new file mode 100644 index 00000000..2c72228c --- /dev/null +++ b/resources/appregistry-application.go @@ -0,0 +1,88 @@ +package resources + +import ( + "context" + "github.com/sirupsen/logrus" + + "github.com/aws/aws-sdk-go/service/appregistry" + + "github.com/ekristen/libnuke/pkg/registry" + "github.com/ekristen/libnuke/pkg/resource" + "github.com/ekristen/libnuke/pkg/types" + + "github.com/ekristen/aws-nuke/v3/pkg/nuke" +) + +const AppRegistryApplicationResource = "AppRegistryApplication" + +func init() { + registry.Register(®istry.Registration{ + Name: AppRegistryApplicationResource, + Scope: nuke.Account, + Lister: &AppRegistryApplicationLister{}, + }) +} + +type AppRegistryApplicationLister struct{} + +func (l *AppRegistryApplicationLister) List(_ context.Context, o interface{}) ([]resource.Resource, error) { + opts := o.(*nuke.ListerOpts) + svc := appregistry.New(opts.Session) + var resources []resource.Resource + + res, err := svc.ListApplications(&appregistry.ListApplicationsInput{}) + if err != nil { + return nil, err + } + + for _, p := range res.Applications { + tags, err := svc.ListTagsForResource(&appregistry.ListTagsForResourceInput{ + ResourceArn: p.Arn, + }) + if err != nil { + logrus.WithError(err).Error("unable to get tags for AppRegistry Application") + } + + newResource := &AppRegistryApplication{ + svc: svc, + ID: p.Id, + } + + if tags != nil { + for key, val := range tags.Tags { + if key == "aws:servicecatalog:applicationName" { + newResource.Name = val + break + } + } + + newResource.Tags = tags.Tags + } + + resources = append(resources, newResource) + } + + return resources, nil +} + +type AppRegistryApplication struct { + svc *appregistry.AppRegistry + ID *string + Name *string + Tags map[string]*string +} + +func (r *AppRegistryApplication) Remove(_ context.Context) error { + _, err := r.svc.DeleteApplication(&appregistry.DeleteApplicationInput{ + Application: r.ID, + }) + return err +} + +func (r *AppRegistryApplication) Properties() types.Properties { + return types.NewPropertiesFromStruct(r) +} + +func (r *AppRegistryApplication) String() string { + return *r.Name +} From 8933e444afe11e9b1ab2bc6f1757c1278f8145f3 Mon Sep 17 00:00:00 2001 From: Erik Kristensen Date: Sat, 31 Aug 2024 14:35:53 -0600 Subject: [PATCH 3/3] chore: fix nolint statements --- resources/appregistry-application.go | 1 + resources/resourcegroups-group.go | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/resources/appregistry-application.go b/resources/appregistry-application.go index 2c72228c..9a3ae246 100644 --- a/resources/appregistry-application.go +++ b/resources/appregistry-application.go @@ -2,6 +2,7 @@ package resources import ( "context" + "github.com/sirupsen/logrus" "github.com/aws/aws-sdk-go/service/appregistry" diff --git a/resources/resourcegroups-group.go b/resources/resourcegroups-group.go index 077f4884..2fdec358 100644 --- a/resources/resourcegroups-group.go +++ b/resources/resourcegroups-group.go @@ -3,15 +3,18 @@ package resources import ( "context" "fmt" - "github.com/ekristen/libnuke/pkg/types" + "github.com/gotidy/ptr" "github.com/sirupsen/logrus" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/service/resourcegroups" - "github.com/ekristen/aws-nuke/v3/pkg/nuke" + "github.com/ekristen/libnuke/pkg/registry" "github.com/ekristen/libnuke/pkg/resource" + "github.com/ekristen/libnuke/pkg/types" + + "github.com/ekristen/aws-nuke/v3/pkg/nuke" ) const ResourceGroupGroupResource = "ResourceGroupGroup"