diff --git a/resources/appregistry-application.go b/resources/appregistry-application.go new file mode 100644 index 00000000..9a3ae246 --- /dev/null +++ b/resources/appregistry-application.go @@ -0,0 +1,89 @@ +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 +} 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..2fdec358 100644 --- a/resources/resourcegroups-groups.go +++ b/resources/resourcegroups-group.go @@ -2,12 +2,19 @@ package resources import ( "context" + "fmt" + + "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" @@ -38,10 +45,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 +75,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 }