Skip to content
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
5 changes: 4 additions & 1 deletion cmd/harbor/root/project/robot/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,10 @@ Examples:
}
permissions = choices
} else {
permissions = prompt.GetRobotPermissionsFromUser("project")
permissions, err = prompt.GetRobotPermissionsFromUser("project")
if err != nil {
return fmt.Errorf("failed to get project permissions: %v", err)
}
if len(permissions) == 0 {
msg := fmt.Errorf("no permissions selected, robot account needs at least one permission")
return fmt.Errorf("failed to create robot: %v", utils.ParseHarborErrorMsg(msg))
Expand Down
10 changes: 8 additions & 2 deletions cmd/harbor/root/project/robot/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,13 +88,19 @@ Examples:
if err != nil {
return fmt.Errorf("failed to get project by name %s: %v", ProjectName, utils.ParseHarborErrorMsg(err))
}
robotID = prompt.GetRobotIDFromUser(int64(project.Payload.ProjectID))
robotID, err = prompt.GetRobotIDFromUser(int64(project.Payload.ProjectID))
if err != nil {
return fmt.Errorf("failed to get robot ID from user: %v", utils.ParseHarborErrorMsg(err))
}
} else {
projectID, err := prompt.GetProjectIDFromUser()
if err != nil {
log.Fatalf("failed to get project by id %d: %v", projectID, utils.ParseHarborErrorMsg(err))
}
robotID = prompt.GetRobotIDFromUser(projectID)
robotID, err = prompt.GetRobotIDFromUser(projectID)
if err != nil {
return fmt.Errorf("failed to get robot ID from user: %v", utils.ParseHarborErrorMsg(err))
}
}
err = api.DeleteRobot(robotID)
if err != nil {
Expand Down
5 changes: 4 additions & 1 deletion cmd/harbor/root/project/robot/refresh.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,10 @@ Examples:
if err != nil {
log.Fatalf("failed to get project by id %d: %v", projectID, utils.ParseHarborErrorMsg(err))
}
robotID = prompt.GetRobotIDFromUser(projectID)
robotID, err = prompt.GetRobotIDFromUser(projectID)
if err != nil {
log.Fatalf("failed to get robot ID from user: %v", utils.ParseHarborErrorMsg(err))
}
}

if secret != "" {
Expand Down
15 changes: 12 additions & 3 deletions cmd/harbor/root/project/robot/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,13 +92,19 @@ Examples:
if err != nil {
log.Fatalf("failed to get project by name %s: %v", ProjectName, err)
}
robotID = prompt.GetRobotIDFromUser(int64(project.Payload.ProjectID))
robotID, err = prompt.GetRobotIDFromUser(int64(project.Payload.ProjectID))
if err != nil {
log.Fatalf("failed to get robot ID from user: %v", utils.ParseHarborErrorMsg(err))
}
} else {
projectID, err := prompt.GetProjectIDFromUser()
if err != nil {
log.Fatalf("failed to get project by id %d: %v", projectID, utils.ParseHarborErrorMsg(err))
}
robotID = prompt.GetRobotIDFromUser(projectID)
robotID, err = prompt.GetRobotIDFromUser(projectID)
if err != nil {
log.Fatalf("failed to get robot ID from user: %v", utils.ParseHarborErrorMsg(err))
}
}

robot, err := api.GetRobot(robotID)
Expand Down Expand Up @@ -138,7 +144,10 @@ Examples:
}
permissions = choices
} else {
permissions = prompt.GetRobotPermissionsFromUser("project")
permissions, err = prompt.GetRobotPermissionsFromUser("project")
if err != nil {
log.Fatalf("failed to get project permissions: %v", utils.ParseHarborErrorMsg(err))
}
}

// []Permission to []*Access
Expand Down
10 changes: 8 additions & 2 deletions cmd/harbor/root/project/robot/view.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,13 +75,19 @@ Examples:
if err != nil {
log.Fatalf("failed to get project by name %s: %v", ProjectName, err)
}
robotID = prompt.GetRobotIDFromUser(int64(project.Payload.ProjectID))
robotID, err = prompt.GetRobotIDFromUser(int64(project.Payload.ProjectID))
if err != nil {
log.Fatalf("failed to get robot ID from user: %v", utils.ParseHarborErrorMsg(err))
}
} else {
projectID, err := prompt.GetProjectIDFromUser()
if err != nil {
log.Fatalf("failed to get project by id %d: %v", projectID, utils.ParseHarborErrorMsg(err))
}
robotID = prompt.GetRobotIDFromUser(projectID)
robotID, err = prompt.GetRobotIDFromUser(projectID)
if err != nil {
log.Fatalf("failed to get robot ID from user: %v", utils.ParseHarborErrorMsg(err))
}
}

robot, err = api.GetRobot(robotID)
Expand Down
33 changes: 27 additions & 6 deletions cmd/harbor/root/robot/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -189,12 +189,19 @@ func handleInteractiveInput(opts *create.CreateView, all bool, permissions *[]mo
func getSystemPermissions(all bool, permissions *[]models.Permission) error {
if len(*permissions) == 0 {
if all {
perms, _ := api.GetPermissions()
perms, err := api.GetPermissions()
if err != nil {
return fmt.Errorf("failed to get system permissions: %v", utils.ParseHarborErrorMsg(err))
}
for _, perm := range perms.Payload.System {
*permissions = append(*permissions, *perm)
}
} else {
*permissions = prompt.GetRobotPermissionsFromUser("system")
var err error
*permissions, err = prompt.GetRobotPermissionsFromUser("system")
if err != nil {
return fmt.Errorf("failed to create robot: %v", utils.ParseHarborErrorMsg(err))
}
if len(*permissions) == 0 {
return fmt.Errorf("failed to create robot: %v",
utils.ParseHarborErrorMsg(fmt.Errorf("no permissions selected, robot account needs at least one permission")))
Expand Down Expand Up @@ -231,7 +238,10 @@ func handleMultipleProjectsPermissions(projectPermissionsMap map[string][]models

if len(selectedProjects) > 0 {
fmt.Println("Select permissions to apply to all selected projects:")
projectPermissions := prompt.GetRobotPermissionsFromUser("project")
projectPermissions, err := prompt.GetRobotPermissionsFromUser("project")
if err != nil {
return fmt.Errorf("failed to get project permissions: %v", err)
}
for _, projectName := range selectedProjects {
projectPermissionsMap[projectName] = projectPermissions
}
Expand All @@ -251,7 +261,10 @@ func handlePerProjectPermissions(opts *create.CreateView, projectPermissionsMap
return fmt.Errorf("project name cannot be empty")
}

projectPermissionsMap[projectName] = prompt.GetRobotPermissionsFromUser("project")
projectPermissionsMap[projectName], err = prompt.GetRobotPermissionsFromUser("project")
if err != nil {
return fmt.Errorf("failed to get project permissions: %v", err)
}

moreProjects, err := promptMoreProjects()
if err != nil {
Expand All @@ -262,7 +275,10 @@ func handlePerProjectPermissions(opts *create.CreateView, projectPermissionsMap
}
}
} else {
projectPermissions := prompt.GetRobotPermissionsFromUser("project")
projectPermissions, err := prompt.GetRobotPermissionsFromUser("project")
if err != nil {
return fmt.Errorf("failed to get project permissions: %v", err)
}
projectPermissionsMap[opts.ProjectName] = projectPermissions
}

Expand Down Expand Up @@ -301,7 +317,12 @@ func buildMergedPermissions(projectPermissionsMap map[string][]models.Permission
func createRobotAndHandleResponse(opts *create.CreateView, exportToFile bool) error {
response, err := api.CreateRobot(*opts)
if err != nil {
return fmt.Errorf("failed to create robot: %v", utils.ParseHarborErrorMsg(err))
errorCode := utils.ParseHarborErrorCode(err)
if errorCode == "403" {
return fmt.Errorf("Permission denied: (Project) Admin privileges are required to execute this command.")
} else {
return fmt.Errorf("failed to create robot: %v", utils.ParseHarborErrorMsg(err))
}
}

logrus.Infof("Successfully created robot account '%s' (ID: %d)",
Expand Down
19 changes: 16 additions & 3 deletions cmd/harbor/root/robot/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,15 +60,28 @@ Examples:
robotName := args[0]
robot, err := api.GetRobotByName(robotName)
if err != nil {
return fmt.Errorf("failed to delete robots: %v", utils.ParseHarborErrorMsg(err))
errorCode := utils.ParseHarborErrorCode(err)
if errorCode == "403" {
return fmt.Errorf("Permission denied: (Project) Admin privileges are required to execute this command.")
} else {
return fmt.Errorf("failed to get robot: %v", utils.ParseHarborErrorMsg(err))
}
}
robotID = robot.ID
} else {
robotID = prompt.GetRobotIDFromUser(-1)
robotID, err = prompt.GetRobotIDFromUser(-1)
if err != nil {
return fmt.Errorf("failed to get robot ID from user: %v", utils.ParseHarborErrorMsg(err))
}
}
err = api.DeleteRobot(robotID)
if err != nil {
return fmt.Errorf("failed to delete robots: %v", utils.ParseHarborErrorMsg(err))
errorCode := utils.ParseHarborErrorCode(err)
if errorCode == "403" {
return fmt.Errorf("Permission denied: (Project) Admin privileges are required to execute this command.")
} else {
return fmt.Errorf("failed to delete robot: %v", utils.ParseHarborErrorMsg(err))
}
}
fmt.Printf("Robot account (ID: %d) was successfully deleted\n", robotID)
return nil
Expand Down
12 changes: 10 additions & 2 deletions cmd/harbor/root/robot/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
package robot

import (
"fmt"

"github.com/goharbor/harbor-cli/pkg/api"
"github.com/goharbor/harbor-cli/pkg/utils"
"github.com/goharbor/harbor-cli/pkg/views/robot/list"
Expand Down Expand Up @@ -61,10 +63,15 @@ Examples:
# Get robot details in JSON format
harbor-cli robot list --output-format json`,
Args: cobra.MaximumNArgs(0),
Run: func(cmd *cobra.Command, args []string) {
RunE: func(cmd *cobra.Command, args []string) error {
robots, err := api.ListRobot(opts)
if err != nil {
log.Errorf("failed to get robots list: %v", utils.ParseHarborErrorMsg(err))
errorCode := utils.ParseHarborErrorCode(err)
if errorCode == "403" {
return fmt.Errorf("Permission denied: (Project) Admin privileges are required to execute this command.")
} else {
return fmt.Errorf("failed to list robots: %v", utils.ParseHarborErrorMsg(err))
}
}

formatFlag := viper.GetString("output-format")
Expand All @@ -76,6 +83,7 @@ Examples:
} else {
list.ListRobots(robots.Payload)
}
return nil
},
}

Expand Down
12 changes: 10 additions & 2 deletions cmd/harbor/root/robot/refresh.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,10 @@ Examples:
log.Fatalf("failed to parse robot ID: %v", err)
}
} else {
robotID = prompt.GetRobotIDFromUser(-1)
robotID, err = prompt.GetRobotIDFromUser(-1)
if err != nil {
log.Fatalf("failed to get robot ID from user: %v", utils.ParseHarborErrorMsg(err))
}
}

if secret != "" {
Expand All @@ -96,7 +99,12 @@ Examples:

response, err := api.RefreshSecret(secret, robotID)
if err != nil {
log.Fatalf("failed to refresh robot secret: %v\n", err)
errorCode := utils.ParseHarborErrorCode(err)
if errorCode == "403" {
log.Fatalf("Permission denied: (Project) Admin privileges are required to execute this command.\n")
} else {
log.Fatalf("failed to refresh robot secret: %v\n", utils.ParseHarborErrorMsg(err))
}
}

log.Info("Secret updated successfully.")
Expand Down
25 changes: 20 additions & 5 deletions cmd/harbor/root/robot/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,10 @@ Examples:
return fmt.Errorf("failed to parse robot ID: %v", err)
}
} else {
robotID = prompt.GetRobotIDFromUser(-1)
robotID, err = prompt.GetRobotIDFromUser(-1)
if err != nil {
return fmt.Errorf("failed to get robot ID from user: %v", utils.ParseHarborErrorMsg(err))
}
}

// Get current robot configuration
Expand Down Expand Up @@ -306,7 +309,10 @@ func getSystemPermissionsForUpdate(all bool, permissions *[]models.Permission) e
*permissions = append(*permissions, *perm)
}
} else {
newPermissions := prompt.GetRobotPermissionsFromUser("system")
newPermissions, err := prompt.GetRobotPermissionsFromUser("system")
if err != nil {
return fmt.Errorf("failed to update robot: %v", utils.ParseHarborErrorMsg(err))
}
if len(newPermissions) == 0 {
return fmt.Errorf("failed to update robot: %v",
utils.ParseHarborErrorMsg(fmt.Errorf("no permissions selected, robot account needs at least one permission")))
Expand Down Expand Up @@ -377,7 +383,10 @@ func handleMultipleProjectsPermissionsForUpdate(projectPermissionsMap map[string

if len(selectedProjects) > 0 {
fmt.Println("Select permissions to apply to all selected projects:")
projectPermissions := prompt.GetRobotPermissionsFromUser("project")
projectPermissions, err := prompt.GetRobotPermissionsFromUser("project")
if err != nil {
return fmt.Errorf("failed to update robot: %v", utils.ParseHarborErrorMsg(err))
}

// Validate project permissions
validProjectPerms, err := validateProjectPermissions(projectPermissions)
Expand Down Expand Up @@ -449,7 +458,10 @@ func handlePerProjectPermissionsForUpdate(projectPermissionsMap map[string][]mod
// Update permissions for selected projects
for _, project := range selectedProjects {
fmt.Printf("Updating permissions for project: %s\n", project)
projectPerms := prompt.GetRobotPermissionsFromUser("project")
projectPerms, err := prompt.GetRobotPermissionsFromUser("project")
if err != nil {
return fmt.Errorf("failed to update robot: %v", utils.ParseHarborErrorMsg(err))
}

// Validate project permissions
validProjectPerms, err := validateProjectPermissions(projectPerms)
Expand All @@ -474,7 +486,10 @@ func handlePerProjectPermissionsForUpdate(projectPermissionsMap map[string][]mod
return fmt.Errorf("project name cannot be empty")
}

projectPerms := prompt.GetRobotPermissionsFromUser("project")
projectPerms, err := prompt.GetRobotPermissionsFromUser("project")
if err != nil {
return fmt.Errorf("failed to update robot: %v", utils.ParseHarborErrorMsg(err))
}

// Validate project permissions
validProjectPerms, err := validateProjectPermissions(projectPerms)
Expand Down
20 changes: 15 additions & 5 deletions cmd/harbor/root/robot/view.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,14 @@
package robot

import (
"fmt"
"strconv"

"github.com/goharbor/go-client/pkg/sdk/v2.0/client/robot"
"github.com/goharbor/harbor-cli/pkg/api"
"github.com/goharbor/harbor-cli/pkg/prompt"
"github.com/goharbor/harbor-cli/pkg/utils"
"github.com/goharbor/harbor-cli/pkg/views/robot/view"
log "github.com/sirupsen/logrus"

"github.com/spf13/cobra"
)
Expand Down Expand Up @@ -56,7 +57,7 @@ Examples:
# Interactive selection (will prompt for robot)
harbor-cli robot view`,
Args: cobra.MaximumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
RunE: func(cmd *cobra.Command, args []string) error {
var (
robot *robot.GetRobotByIDOK
robotID int64
Expand All @@ -66,20 +67,29 @@ Examples:
if len(args) == 1 {
robotID, err = strconv.ParseInt(args[0], 10, 64)
if err != nil {
log.Fatalf("failed to parse robot ID: %v", err)
return fmt.Errorf("failed to parse robot ID %q: %v", args[0], err)
}
} else {
robotID = prompt.GetRobotIDFromUser(-1)
robotID, err = prompt.GetRobotIDFromUser(-1)
if err != nil {
return fmt.Errorf("failed to get robot ID from user: %v", utils.ParseHarborErrorMsg(err))
}
}

robot, err = api.GetRobot(robotID)
if err != nil {
log.Fatalf("failed to get robot: %v", err)
errorCode := utils.ParseHarborErrorCode(err)
if errorCode == "403" {
return fmt.Errorf("Permission denied: (Project) Admin privileges are required to execute this command.")
} else {
return fmt.Errorf("failed to get robot: %v", utils.ParseHarborErrorMsg(err))
}
}

// Convert to a list and display
// robots := &models.Robot{robot.Payload}
view.ViewRobot(robot.Payload)
return nil
},
}

Expand Down
Loading