From 5bbf322a66a16fad349553907b5812c6e2dedfa5 Mon Sep 17 00:00:00 2001 From: Adwait Godbole <68469605+adwait-godbole@users.noreply.github.com> Date: Tue, 26 Nov 2024 20:15:39 +0530 Subject: [PATCH] add '--force' flag to delete non-empty projects (#252) Signed-off-by: adwait-godbole Signed-off-by: Vadim Bauer Co-authored-by: Vadim Bauer --- cmd/harbor/root/project/delete.go | 8 ++++++-- pkg/api/project_handler.go | 26 ++++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/cmd/harbor/root/project/delete.go b/cmd/harbor/root/project/delete.go index b09447cb..3e0e5b98 100644 --- a/cmd/harbor/root/project/delete.go +++ b/cmd/harbor/root/project/delete.go @@ -9,6 +9,7 @@ import ( // DeleteProjectCommand creates a new `harbor delete project` command func DeleteProjectCommand() *cobra.Command { + var forceDelete bool cmd := &cobra.Command{ Use: "delete", @@ -18,10 +19,10 @@ func DeleteProjectCommand() *cobra.Command { var err error if len(args) > 0 { - err = api.DeleteProject(args[0]) + err = api.DeleteProject(args[0], forceDelete) } else { projectName := prompt.GetProjectNameFromUser() - err = api.DeleteProject(projectName) + err = api.DeleteProject(projectName, forceDelete) } if err != nil { log.Errorf("failed to delete project: %v", err) @@ -29,5 +30,8 @@ func DeleteProjectCommand() *cobra.Command { }, } + flags := cmd.Flags() + flags.BoolVar(&forceDelete, "force", false, "Deletes all repositories and artifacts within the project") + return cmd } diff --git a/pkg/api/project_handler.go b/pkg/api/project_handler.go index 5ebb3df2..5a06e9da 100644 --- a/pkg/api/project_handler.go +++ b/pkg/api/project_handler.go @@ -4,6 +4,7 @@ import ( "strconv" "github.com/goharbor/go-client/pkg/sdk/v2.0/client/project" + "github.com/goharbor/go-client/pkg/sdk/v2.0/client/repository" "github.com/goharbor/go-client/pkg/sdk/v2.0/client/search" "github.com/goharbor/go-client/pkg/sdk/v2.0/models" "github.com/goharbor/harbor-cli/pkg/utils" @@ -55,19 +56,40 @@ func GetProject(projectName string) error { return nil } -func DeleteProject(projectName string) error { +func DeleteProject(projectName string, forceDelete bool) error { ctx, client, err := utils.ContextWithClient() if err != nil { return err } + if forceDelete { + var resp repository.ListRepositoriesOK + + resp, err = ListRepository(projectName) + + if err != nil { + log.Errorf("failed to list repositories: %v", err) + return err + } + + for _, repo := range resp.Payload { + _, repoName := utils.ParseProjectRepo(repo.Name) + err = RepoDelete(projectName, repoName) + + if err != nil { + log.Errorf("failed to delete repository: %v", err) + return err + } + } + } + _, err = client.Project.DeleteProject(ctx, &project.DeleteProjectParams{ProjectNameOrID: projectName}) if err != nil { return err } - log.Info("project deleted successfully") + log.Infof("Project %s deleted successfully", projectName) return nil }