Skip to content

Commit

Permalink
add: batch deletion of resources
Browse files Browse the repository at this point in the history
handles concurrent deletion of projects, registries and users

Signed-off-by: bupd <[email protected]>
  • Loading branch information
bupd committed May 29, 2024
1 parent a97d084 commit 629ff2c
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 31 deletions.
56 changes: 46 additions & 10 deletions cmd/harbor/root/project/delete.go
Original file line number Diff line number Diff line change
@@ -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"
Expand All @@ -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)
}
},
}
Expand Down
52 changes: 42 additions & 10 deletions cmd/harbor/root/registry/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package registry

import (
"strconv"
"sync"

"github.com/goharbor/harbor-cli/pkg/api"
"github.com/goharbor/harbor-cli/pkg/prompt"
Expand All @@ -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)
}
},
}
Expand Down
51 changes: 40 additions & 11 deletions cmd/harbor/root/user/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package user

import (
"strconv"
"sync"

"github.com/goharbor/harbor-cli/pkg/api"
"github.com/goharbor/harbor-cli/pkg/prompt"
Expand All @@ -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

}

0 comments on commit 629ff2c

Please sign in to comment.