diff --git a/cmd/harbor/root/project/delete.go b/cmd/harbor/root/project/delete.go index b09447cb..65a3c6b5 100644 --- a/cmd/harbor/root/project/delete.go +++ b/cmd/harbor/root/project/delete.go @@ -1,6 +1,8 @@ package project import ( + "sync" + "github.com/goharbor/harbor-cli/pkg/api" "github.com/goharbor/harbor-cli/pkg/prompt" log "github.com/sirupsen/logrus" @@ -9,22 +11,56 @@ import ( // DeleteProjectCommand creates a new `harbor delete project` command func DeleteProjectCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "delete", - Short: "delete project by name or id", - Args: cobra.MaximumNArgs(1), + Use: "delete [NAME|ID]", + Short: "delete project by name or id", + Example: ` harbor project delete [NAME|ID]`, + Args: cobra.MinimumNArgs(0), Run: func(cmd *cobra.Command, args []string) { - var err error + var wg sync.WaitGroup + errChan := make( + chan error, + len(args), + ) // Channel to collect errors if len(args) > 0 { - err = api.DeleteProject(args[0]) + for _, arg := range args { + wg.Add(1) + go func(projectName string) { + defer wg.Done() + if err := api.DeleteProject(projectName); err != nil { + errChan <- err + } + }(arg) + } } else { - projectName := prompt.GetProjectNameFromUser() - err = api.DeleteProject(projectName) + userId := prompt.GetUserIdFromUser() + wg.Add(1) + go func(userId int64) { + defer wg.Done() + if err := api.DeleteUser(userId); err != nil { + errChan <- err + } + }(userId) + } + + // Wait for all goroutines to finish + go func() { + wg.Wait() + close(errChan) + }() + + // Collect and handle errors + var finalErr error + for err := range errChan { + if finalErr == nil { + finalErr = err + } else { + log.Errorf("Error: %v", err) + } } - if err != nil { - log.Errorf("failed to delete project: %v", err) + if finalErr != nil { + log.Errorf("failed to delete some projects: %v", finalErr) } }, } diff --git a/cmd/harbor/root/registry/delete.go b/cmd/harbor/root/registry/delete.go index ed9d426b..9edc37d5 100644 --- a/cmd/harbor/root/registry/delete.go +++ b/cmd/harbor/root/registry/delete.go @@ -2,6 +2,7 @@ package registry import ( "strconv" + "sync" "github.com/goharbor/harbor-cli/pkg/api" "github.com/goharbor/harbor-cli/pkg/prompt" @@ -11,23 +12,54 @@ import ( // NewDeleteRegistryCommand creates a new `harbor delete registry` command func DeleteRegistryCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "delete", + Use: "delete [registryId]", Short: "delete registry by id", - Args: cobra.MaximumNArgs(1), + Args: cobra.MinimumNArgs(0), Run: func(cmd *cobra.Command, args []string) { - var err error - + var wg sync.WaitGroup + errChan := make(chan error, len(args)) if len(args) > 0 { - registryId, _ := strconv.ParseInt(args[0], 10, 64) - err = api.DeleteRegistry(registryId) + for _, arg := range args { + registryId, _ := strconv.ParseInt(arg, 10, 64) + wg.Add(1) + go func(registryId int64) { + defer wg.Done() + if err := api.DeleteRegistry(registryId); err != nil { + errChan <- err + } + }(registryId) + } } else { registryId := prompt.GetRegistryNameFromUser() - err = api.DeleteRegistry(registryId) + wg.Add(1) + + go func(registryId int64) { + defer wg.Done() + if err := api.DeleteRegistry(registryId); err != nil { + errChan <- err + } + }(registryId) } - if err != nil { - log.Errorf("failed to delete registry: %v", err) + + // Wait for all goroutines to finish + go func() { + wg.Wait() + close(errChan) + }() + + // Collect and handle errors + var finalErr error + for err := range errChan { + if finalErr == nil { + finalErr = err + } else { + log.Errorf("Error: %v", err) + } + } + + if finalErr != nil { + log.Errorf("failed to delete registry: %v", finalErr) } }, } diff --git a/cmd/harbor/root/user/delete.go b/cmd/harbor/root/user/delete.go index 1b5afc8a..91c5e831 100644 --- a/cmd/harbor/root/user/delete.go +++ b/cmd/harbor/root/user/delete.go @@ -2,6 +2,7 @@ package user import ( "strconv" + "sync" "github.com/goharbor/harbor-cli/pkg/api" "github.com/goharbor/harbor-cli/pkg/prompt" @@ -12,26 +13,54 @@ import ( func UserDeleteCmd() *cobra.Command { cmd := &cobra.Command{ Use: "delete", - Short: "delete user", - Args: cobra.MaximumNArgs(1), + Short: "delete user by UserID", + Args: cobra.MinimumNArgs(0), Run: func(cmd *cobra.Command, args []string) { - var err error - if len(args) > 0 { - userId, _ := strconv.ParseInt(args[0], 10, 64) - err = api.DeleteUser(userId) + var wg sync.WaitGroup + errChan := make(chan error, len(args)) // Channel to collect error + if len(args) > 0 { + for _, arg := range args { + userId, _ := strconv.ParseInt(arg, 10, 64) + wg.Add(1) + go func(userId int64) { + defer wg.Done() + if err := api.DeleteUser(userId); err != nil { + errChan <- err + } + }(userId) + } } else { userId := prompt.GetUserIdFromUser() - err = api.DeleteUser(userId) + wg.Add(1) + go func(userId int64) { + defer wg.Done() + if err := api.DeleteUser(userId); err != nil { + errChan <- err + } + }(userId) } - if err != nil { - log.Errorf("failed to delete user: %v", err) - } + // Wait for all goroutines to finish + go func() { + wg.Wait() + close(errChan) + }() + // Collect and handle errors + var finalErr error + for err := range errChan { + if finalErr == nil { + finalErr = err + } else { + log.Errorf("Error: %v", err) + } + } + if finalErr != nil { + log.Errorf("failed to delete user: %v", finalErr) + } }, } return cmd - }