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 the Project flow in cli #35

Merged
merged 10 commits into from May 8, 2024
17 changes: 8 additions & 9 deletions cmd/harbor/root/login.go
Expand Up @@ -12,10 +12,10 @@ import (
)

var (
serverAddress string
Username string
Password string
Name string
serverAddress string
Username string
Password string
Name string
)

// LoginCommand creates a new `harbor login` command
Expand All @@ -28,10 +28,10 @@ func LoginCommand() *cobra.Command {
Long: "Authenticate with Harbor Registry.",
Args: cobra.MaximumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
if len(args) > 0 {
serverAddress = args[0]
}

if len(args) > 0 {
serverAddress = args[0]
}

loginView := login.LoginView{
Server: serverAddress,
Expand Down Expand Up @@ -80,7 +80,6 @@ func createLoginView(loginView *login.LoginView) error {

}


func runLogin(opts login.LoginView) error {
clientConfig := &harbor.ClientSetConfig{
URL: opts.Server,
Expand Down
90 changes: 90 additions & 0 deletions cmd/harbor/root/project/create.go
@@ -0,0 +1,90 @@
package project

import (
"context"
"strconv"

"github.com/goharbor/go-client/pkg/sdk/v2.0/client/project"
"github.com/goharbor/go-client/pkg/sdk/v2.0/models"
"github.com/goharbor/harbor-cli/pkg/constants"
"github.com/goharbor/harbor-cli/pkg/utils"
"github.com/goharbor/harbor-cli/pkg/views/project/create"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)

// CreateProjectCommand creates a new `harbor create project` command
func CreateProjectCommand() *cobra.Command {
var opts create.CreateView

cmd := &cobra.Command{
Use: "project",
Short: "create project",
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) {
credentialName, err := cmd.Flags().GetString(constants.CredentialNameOption)
if err != nil {
log.Fatalf("failed to get credential name: %v", err)
}

createView := &create.CreateView{
ProjectName: opts.ProjectName,
Public: opts.Public,
RegistryID: opts.RegistryID,
StorageLimit: opts.StorageLimit,
}

if opts.ProjectName != "" && opts.RegistryID != "" && opts.StorageLimit != "" {
err = runCreateProject(opts, credentialName)
} else {
err = createProjectView(createView, credentialName)
}

if err != nil {
log.Errorf("failed to create project: %v", err)
}

},
}

flags := cmd.Flags()
flags.StringVarP(&opts.ProjectName, "name", "", "", "Name of the project")
flags.BoolVarP(&opts.Public, "public", "", true, "Project is public or private")
flags.StringVarP(&opts.RegistryID, "registry-id", "", "", "ID of referenced registry when creating the proxy cache project")
flags.StringVarP(&opts.StorageLimit, "storage-limit", "", "-1", "Storage quota of the project")

return cmd
}

func createProjectView(createView *create.CreateView, credentialName string) error {
if createView == nil {
createView = &create.CreateView{
ProjectName: "",
Public: true,
RegistryID: "",
StorageLimit: "-1",
}
}

create.CreateProjectView(createView)

return runCreateProject(*createView, credentialName)

}

func runCreateProject(opts create.CreateView, credentialName string) error {
client := utils.GetClientByCredentialName(credentialName)
ctx := context.Background()
registryID, _ := strconv.ParseInt(opts.RegistryID, 10, 64)

storageLimit, _ := strconv.ParseInt(opts.StorageLimit, 10, 64)

response, err := client.Project.CreateProject(ctx, &project.CreateProjectParams{Project: &models.ProjectReq{ProjectName: opts.ProjectName, Public: &opts.Public, RegistryID: &registryID, StorageLimit: &storageLimit}})

if err != nil {
return err
}

utils.PrintPayloadInJSONFormat(response)
return nil
}
56 changes: 0 additions & 56 deletions cmd/harbor/root/project/create_project.go

This file was deleted.

Expand Up @@ -6,38 +6,39 @@ import (
"github.com/goharbor/go-client/pkg/sdk/v2.0/client/project"
"github.com/goharbor/harbor-cli/pkg/constants"
"github.com/goharbor/harbor-cli/pkg/utils"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)

type deleteProjectOptions struct {
projectNameOrID string
}

// DeleteProjectCommand creates a new `harbor delete project` command
func DeleteProjectCommand() *cobra.Command {
var opts deleteProjectOptions

cmd := &cobra.Command{
Use: "project [NAME|ID]",
Short: "delete project by name or id",
Args: cobra.ExactArgs(1),
RunE: func(cmd *cobra.Command, args []string) error {
opts.projectNameOrID = args[0]
Args: cobra.MaximumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
credentialName, err := cmd.Flags().GetString(constants.CredentialNameOption)

if len(args) > 0 {
err = runDeleteProject(args[0], credentialName)
} else {
projectName := utils.GetProjectNameFromUser(credentialName)
err = runDeleteProject(projectName, credentialName)
}
if err != nil {
return err
log.Errorf("failed to delete project: %v", err)
}
return runDeleteProject(opts, credentialName)
},
}

return cmd
}

func runDeleteProject(opts deleteProjectOptions, credentialName string) error {
func runDeleteProject(projectName string, credentialName string) error {
client := utils.GetClientByCredentialName(credentialName)
ctx := context.Background()
response, err := client.Project.DeleteProject(ctx, &project.DeleteProjectParams{ProjectNameOrID: opts.projectNameOrID})
response, err := client.Project.DeleteProject(ctx, &project.DeleteProjectParams{ProjectNameOrID: projectName})

if err != nil {
return err
Expand Down
Expand Up @@ -6,9 +6,13 @@ import (
"github.com/goharbor/go-client/pkg/sdk/v2.0/client/project"
"github.com/goharbor/harbor-cli/pkg/constants"
"github.com/goharbor/harbor-cli/pkg/utils"
list "github.com/goharbor/harbor-cli/pkg/views/project/list"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)

var FormatFlag string

type listProjectOptions struct {
name string
owner string
Expand All @@ -27,16 +31,24 @@ func ListProjectCommand() *cobra.Command {
cmd := &cobra.Command{
Use: "project",
Short: "list project",
RunE: func(cmd *cobra.Command, args []string) error {
Run: func(cmd *cobra.Command, args []string) {
credentialName, err := cmd.Flags().GetString(constants.CredentialNameOption)
projects, err := RunListProject(credentialName, opts)
if err != nil {
return err
log.Fatalf("failed to get projects list: %v", err)
}
// Print the payload in JSON format
if FormatFlag != "" {
utils.PrintPayloadInJSONFormat(projects)
return
}
return runListProject(opts, credentialName)

list.ListProjects(projects.Payload)
},
}

flags := cmd.Flags()
flags.StringVarP(&FormatFlag, "output", "o", FormatFlag, "output format json")
flags.StringVarP(&opts.name, "name", "", "", "Name of the project")
flags.StringVarP(&opts.owner, "owner", "", "", "Name of the project owner")
flags.Int64VarP(&opts.page, "page", "", 1, "Page number")
Expand All @@ -49,15 +61,12 @@ func ListProjectCommand() *cobra.Command {
return cmd
}

func runListProject(opts listProjectOptions, credentialName string) error {
func RunListProject(credentialName string, opts listProjectOptions) (*project.ListProjectsOK, error) {
client := utils.GetClientByCredentialName(credentialName)
ctx := context.Background()
response, err := client.Project.ListProjects(ctx, &project.ListProjectsParams{Name: &opts.name, Owner: &opts.owner, Page: &opts.page, PageSize: &opts.pageSize, Public: &opts.public, Q: &opts.q, Sort: &opts.sort, WithDetail: &opts.withDetail})

if err != nil {
return err
return nil, err
}

utils.PrintPayloadInJSONFormat(response)
return nil
return response, nil
}
18 changes: 11 additions & 7 deletions go.mod
Expand Up @@ -2,16 +2,20 @@ module github.com/goharbor/harbor-cli

go 1.21

require github.com/spf13/cobra v1.8.0
require (
github.com/charmbracelet/bubbles v0.18.0
github.com/charmbracelet/bubbletea v0.25.0
github.com/charmbracelet/huh v0.3.0
github.com/charmbracelet/lipgloss v0.10.0
github.com/sirupsen/logrus v1.9.3
github.com/spf13/cobra v1.8.0
github.com/stretchr/testify v1.9.0
)

require (
github.com/atotto/clipboard v0.1.4 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/catppuccin/go v0.2.0 // indirect
github.com/charmbracelet/bubbles v0.17.2-0.20240108170749-ec883029c8e6 // indirect
github.com/charmbracelet/bubbletea v0.25.0 // indirect
github.com/charmbracelet/huh v0.3.0 // indirect
github.com/charmbracelet/lipgloss v0.9.1 // indirect
github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/google/go-cmp v0.5.9 // indirect
Expand All @@ -24,8 +28,8 @@ require (
github.com/muesli/reflow v0.3.0 // indirect
github.com/muesli/termenv v0.15.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rivo/uniseg v0.4.4 // indirect
github.com/stretchr/testify v1.9.0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/sahilm/fuzzy v0.1.1-0.20230530133925-c48e322e2a8f // indirect
golang.org/x/sync v0.4.0 // indirect
golang.org/x/term v0.13.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
Expand Down