Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Improve Performance of delete Command with Concurrency #80

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
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
51 changes: 42 additions & 9 deletions cmd/harbor/root/project/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
package project

import (
"sync"

"github.com/goharbor/harbor-cli/pkg/api"
"github.com/goharbor/harbor-cli/pkg/prompt"
log "github.com/sirupsen/logrus"
Expand All @@ -23,22 +25,53 @@ import (
// DeleteProjectCommand creates a new `harbor delete project` command
func DeleteProjectCommand() *cobra.Command {
var forceDelete bool

cmd := &cobra.Command{
Use: "delete",
Short: "delete project by name or id",
Args: cobra.MaximumNArgs(1),
Use: "delete",
Short: "delete project by name or id",
Example: ` harbor project delete [projectname]`,
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], forceDelete)
for _, arg := range args {
wg.Add(1)
go func(projectName string) {
defer wg.Done()
if err := api.DeleteProject(projectName, forceDelete); err != nil {
errChan <- err
}
}(arg)
}
} else {
projectName := prompt.GetProjectNameFromUser()
err = api.DeleteProject(projectName, forceDelete)
err := api.DeleteProject(projectName, forceDelete)
if err != nil {
log.Errorf("failed to delete project: %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 err != nil {
log.Errorf("failed to delete project: %v", err)
if finalErr != nil {
log.Errorf("failed to delete some projects: %v", finalErr)
}
},
}
Expand Down
48 changes: 39 additions & 9 deletions cmd/harbor/root/registry/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
package registry

import (
"sync"

"github.com/goharbor/harbor-cli/pkg/api"
"github.com/goharbor/harbor-cli/pkg/prompt"
log "github.com/sirupsen/logrus"
Expand All @@ -23,21 +25,49 @@ import (
func DeleteRegistryCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "delete",
Short: "delete registry",
Short: "delete registry by name or id",
Example: "harbor registry delete [registryname]",
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 {
registryName, _ := api.GetRegistryIdByName(args[0])
err = api.DeleteRegistry(registryName)
for _, arg := range args {
registryID, _ := api.GetRegistryIdByName(arg)
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)
err := api.DeleteRegistry(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 err != nil {
log.Errorf("failed to delete registry: %v", err)

if finalErr != nil {
log.Errorf("failed to delete registry: %v", finalErr)
}
},
}
Expand Down
44 changes: 38 additions & 6 deletions cmd/harbor/root/user/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
package user

import (
"sync"

"github.com/goharbor/harbor-cli/pkg/api"
"github.com/goharbor/harbor-cli/pkg/prompt"
log "github.com/sirupsen/logrus"
Expand All @@ -23,20 +25,50 @@ import (
func UserDeleteCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "delete",
Short: "delete user",
Args: cobra.MaximumNArgs(1),
Short: "delete user by name or 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 error

if len(args) > 0 {
userName, _ := api.GetUsersIdByName(args[0])
err = api.DeleteUser(userName)
for _, arg := range args {
userID, _ := api.GetUsersIdByName(arg)
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)
if err != nil {
log.Errorf("failed to delete user: %v", err)
}
}

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)
}
},
}
Expand Down