From c9d6a93e68888eee6f90351259a680847f580d26 Mon Sep 17 00:00:00 2001 From: Aaron Miller Date: Tue, 11 Jul 2023 16:22:29 -0700 Subject: [PATCH] add: `delete cognito-user-pool` --- cmd/delete/cognito.go | 31 +++++++++++++++++++ cmd/{ => delete}/delete.go | 24 ++++++++++++-- cmd/root.go | 3 +- pkg/aws/cognito_userpool.go | 12 +++++++ .../cognito/userpool/cognito_userpool.go | 3 +- pkg/resource/cognito/userpool/manager.go | 31 +++++++++++++++++-- pkg/resource/cognito/userpool/options.go | 19 +++++++++++- 7 files changed, 116 insertions(+), 7 deletions(-) create mode 100644 cmd/delete/cognito.go rename cmd/{ => delete}/delete.go (76%) diff --git a/cmd/delete/cognito.go b/cmd/delete/cognito.go new file mode 100644 index 0000000..facfc58 --- /dev/null +++ b/cmd/delete/cognito.go @@ -0,0 +1,31 @@ +package delete + +import ( + "github.com/awslabs/eksdemo/pkg/resource" + "github.com/awslabs/eksdemo/pkg/resource/cognito/userpool" + "github.com/spf13/cobra" +) + +var cognitoResources []func() *resource.Resource + +func NewCognitoCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "cognito", + Short: "Amazon Cognito Resources", + } + + // Don't show flag errors for `delete cognito` without a subcommand + cmd.DisableFlagParsing = true + + for _, r := range cognitoResources { + cmd.AddCommand(r().NewDeleteCmd()) + } + + return cmd +} + +func init() { + cognitoResources = []func() *resource.Resource{ + userpool.New, + } +} diff --git a/cmd/delete.go b/cmd/delete/delete.go similarity index 76% rename from cmd/delete.go rename to cmd/delete/delete.go index 827c79b..4788e78 100644 --- a/cmd/delete.go +++ b/cmd/delete/delete.go @@ -1,6 +1,7 @@ -package cmd +package delete import ( + "github.com/awslabs/eksdemo/pkg/resource" "github.com/awslabs/eksdemo/pkg/resource/acm_certificate" "github.com/awslabs/eksdemo/pkg/resource/addon" "github.com/awslabs/eksdemo/pkg/resource/amg_workspace" @@ -21,7 +22,7 @@ import ( "github.com/spf13/cobra" ) -func newCmdDelete() *cobra.Command { +func NewDeleteCmd() *cobra.Command { cmd := &cobra.Command{ Use: "delete", Short: "delete resource(s)", @@ -36,6 +37,8 @@ func newCmdDelete() *cobra.Command { cmd.AddCommand(amp_workspace.NewResource().NewDeleteCmd()) cmd.AddCommand(cloudformation_stack.NewResource().NewDeleteCmd()) cmd.AddCommand(cluster.NewResource().NewDeleteCmd()) + cmd.AddCommand(NewCognitoCmd()) + cmd.AddCommand(NewDeleteAliasCmds(cognitoResources, "cognito-")...) cmd.AddCommand(dns_record.NewResource().NewDeleteCmd()) cmd.AddCommand(ec2_instance.NewResource().NewDeleteCmd()) cmd.AddCommand(fargate_profile.NewResource().NewDeleteCmd()) @@ -50,3 +53,20 @@ func newCmdDelete() *cobra.Command { return cmd } + +// This creates alias commands for subcommands under DELETE +func NewDeleteAliasCmds(resList []func() *resource.Resource, prefix string) []*cobra.Command { + cmds := make([]*cobra.Command, 0, len(resList)) + + for _, res := range resList { + r := res() + r.Command.Name = prefix + r.Command.Name + r.Command.Hidden = true + for i, alias := range r.Command.Aliases { + r.Command.Aliases[i] = prefix + alias + } + cmds = append(cmds, r.NewDeleteCmd()) + } + + return cmds +} diff --git a/cmd/root.go b/cmd/root.go index 1aa98f6..83241a2 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -5,6 +5,7 @@ import ( "os" "github.com/awslabs/eksdemo/cmd/create" + del "github.com/awslabs/eksdemo/cmd/delete" "github.com/awslabs/eksdemo/cmd/get" "github.com/awslabs/eksdemo/cmd/install" "github.com/awslabs/eksdemo/pkg/aws" @@ -44,7 +45,7 @@ func init() { rootCmd.AddCommand( create.NewCreateCmd(), - newCmdDelete(), + del.NewDeleteCmd(), get.NewGetCmd(), install.NewInstallCmd(), install.NewUninstallCmd(), diff --git a/pkg/aws/cognito_userpool.go b/pkg/aws/cognito_userpool.go index db074f6..958a5aa 100644 --- a/pkg/aws/cognito_userpool.go +++ b/pkg/aws/cognito_userpool.go @@ -16,6 +16,7 @@ func NewCognitoUserPoolClient() *CognitoUserPoolClient { return &CognitoUserPoolClient{cognitoidp.NewFromConfig(GetConfig())} } +// Creates a new Amazon Cognito user pool and sets the password policy for the pool. func (c *CognitoUserPoolClient) CreateUserPool(name string) (*types.UserPoolType, error) { input := cognitoidp.CreateUserPoolInput{ PoolName: aws.String(name), @@ -29,6 +30,16 @@ func (c *CognitoUserPoolClient) CreateUserPool(name string) (*types.UserPoolType return result.UserPool, err } +// Deletes the specified Amazon Cognito user pool. +func (c *CognitoUserPoolClient) DeleteUserPool(id string) error { + _, err := c.Client.DeleteUserPool(context.Background(), &cognitoidp.DeleteUserPoolInput{ + UserPoolId: aws.String(id), + }) + + return err +} + +// Returns the configuration information and metadata of the specified user pool. func (c *CognitoUserPoolClient) DescribeUserPool(id string) (*types.UserPoolType, error) { result, err := c.Client.DescribeUserPool(context.Background(), &cognitoidp.DescribeUserPoolInput{ UserPoolId: aws.String(id), @@ -41,6 +52,7 @@ func (c *CognitoUserPoolClient) DescribeUserPool(id string) (*types.UserPoolType return result.UserPool, nil } +// Lists the user pools associated with an AWS account. func (c *CognitoUserPoolClient) ListUserPools() ([]types.UserPoolDescriptionType, error) { pools := []types.UserPoolDescriptionType{} pageNum := 0 diff --git a/pkg/resource/cognito/userpool/cognito_userpool.go b/pkg/resource/cognito/userpool/cognito_userpool.go index 93aed01..0a21d59 100644 --- a/pkg/resource/cognito/userpool/cognito_userpool.go +++ b/pkg/resource/cognito/userpool/cognito_userpool.go @@ -6,9 +6,10 @@ import ( ) func New() *resource.Resource { - options, createFlags, _ := NewOptions() + options, createFlags, deleteFlags := NewOptions() res := NewWithOptions(options) res.CreateFlags = createFlags + res.DeleteFlags = deleteFlags return res } diff --git a/pkg/resource/cognito/userpool/manager.go b/pkg/resource/cognito/userpool/manager.go index 1245391..534d6a5 100644 --- a/pkg/resource/cognito/userpool/manager.go +++ b/pkg/resource/cognito/userpool/manager.go @@ -56,8 +56,35 @@ func (m *Manager) Create(options resource.Options) error { return nil } -func (m *Manager) Delete(_ resource.Options) error { - return fmt.Errorf("feature not supported") +func (m *Manager) Delete(o resource.Options) error { + options, ok := o.(*Options) + if !ok { + return fmt.Errorf("internal error, unable to cast options to userpool.Options") + } + + id := options.Common().Id + + if id == "" { + up, err := m.userPoolGetter.GetUserPoolByName(options.UserPoolName) + + if err != nil { + var rnfe *resource.NotFoundByNameError + if errors.As(err, &rnfe) { + fmt.Printf("Cognito User Pool with name %q does not exist\n", options.UserPoolName) + return nil + } + return err + } + id = awssdk.ToString(up.Id) + } + + err := m.cognitoClient.DeleteUserPool(id) + if err != nil { + return aws.FormatErrorAsMessageOnly(err) + } + fmt.Printf("Cognito User Pool Id %q deleted\n", id) + + return nil } func (m *Manager) SetDryRun() { diff --git a/pkg/resource/cognito/userpool/options.go b/pkg/resource/cognito/userpool/options.go index 0d79a72..34f2591 100644 --- a/pkg/resource/cognito/userpool/options.go +++ b/pkg/resource/cognito/userpool/options.go @@ -1,8 +1,11 @@ package userpool import ( + "fmt" + "github.com/awslabs/eksdemo/pkg/cmd" "github.com/awslabs/eksdemo/pkg/resource" + "github.com/spf13/cobra" ) type Options struct { @@ -21,7 +24,21 @@ func NewOptions() (options *Options, createFlags, deleteFlags cmd.Flags) { createFlags = cmd.Flags{} - deleteFlags = cmd.Flags{} + deleteFlags = cmd.Flags{ + &cmd.StringFlag{ + CommandFlag: cmd.CommandFlag{ + Name: "id", + Description: "delete by ID instead", + Validate: func(cmd *cobra.Command, args []string) error { + if options.Id == "" && len(args) == 0 { + return fmt.Errorf("must include either %q argument or %q flag", "NAME", "--id") + } + return nil + }, + }, + Option: &options.Id, + }, + } return }