Skip to content
24 changes: 23 additions & 1 deletion cmd/harbor/root/artifact/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,14 @@ import (
)

func ListArtifactCommand() *cobra.Command {
var opts api.ListFlags

var (
opts api.ListFlags
// For querying, opts.Q
fuzzy []string
match []string
ranges []string
)

cmd := &cobra.Command{
Use: "list",
Expand Down Expand Up @@ -67,6 +74,18 @@ Supports pagination, search queries, and sorting using flags.`,
repoName = prompt.GetRepoNameFromUser(projectName)
}

if len(fuzzy) != 0 || len(match) != 0 || len(ranges) != 0 {
q, qErr := utils.BuildQueryParam(fuzzy, match, ranges,
[]string{"id", "type", "media_type", "artifact_id", "artifact_type", "project_id", "repository_id", "repository_name",
"manifest_media_type", "digest"},
)
if qErr != nil {
return qErr
}

opts.Q = q
Comment thread
Mujib-Ahasan marked this conversation as resolved.
}

artifacts, err = api.ListArtifact(projectName, repoName, opts)

if err != nil {
Expand All @@ -91,6 +110,9 @@ Supports pagination, search queries, and sorting using flags.`,
flags.Int64VarP(&opts.PageSize, "page-size", "n", 10, "Size of per page")
flags.StringVarP(&opts.Q, "query", "q", "", "Query string to query resources")
flags.StringVarP(&opts.Sort, "sort", "s", "", "Sort the resource list in ascending or descending order")
flags.StringSliceVar(&fuzzy, "fuzzy", nil, "Fuzzy match filter (key=value)")
flags.StringSliceVar(&match, "match", nil, "exact match filter (key=value)")
flags.StringSliceVar(&ranges, "range", nil, "range filter (key=min~max)")

return cmd
}
187 changes: 187 additions & 0 deletions cmd/harbor/root/artifact/tags.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
// Copyright Project Harbor Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package artifact

import (
"github.com/goharbor/go-client/pkg/sdk/v2.0/client/artifact"
"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/artifact/tags/create"
"github.com/goharbor/harbor-cli/pkg/views/artifact/tags/list"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)

func ArtifactTagsCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "tags",
Short: "Manage tags of an artifact",
Example: ` harbor artifact tags list <project>/<repository>/<reference>`,
}

cmd.AddCommand(
ListTagsCmd(),
DeleteTagsCmd(),
CreateTagsCmd(),
)

return cmd
}

func CreateTagsCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "create",
Short: "Create a tag of an artifact",
Example: `harbor artifact tags create <project>/<repository>/<reference> <tag>`,
Run: func(cmd *cobra.Command, args []string) {
var err error
var projectName, repoName, reference string
var tagName string
if len(args) > 0 {
projectName, repoName, reference, err = utils.ParseProjectRepoReference(args[0])
if err != nil {
log.Errorf("failed to parse project/repo/reference: %v", err)
}
tagName = args[1]
} else {
projectName, err = prompt.GetProjectNameFromUser()
if err != nil {
log.Errorf("failed to get project name: %v", utils.ParseHarborErrorMsg(err))
}
repoName = prompt.GetRepoNameFromUser(projectName)
reference = prompt.GetReferenceFromUser(repoName, projectName)
create.CreateTagView(&tagName)
}
err = api.CreateTag(projectName, repoName, reference, tagName)
if err != nil {
log.Errorf("failed to create tag: %v", err)
}
},
}

return cmd
}

func ListTagsCmd() *cobra.Command {

var (
opts api.ListFlags
// For querying, opts.Q
fuzzy []string
match []string
ranges []string
)

cmd := &cobra.Command{
Use: "list",
Short: "List tags of an artifact",
Example: `harbor artifact tags list <project>/<repository>/<reference>`,
Run: func(cmd *cobra.Command, args []string) {
var err error
var tags *artifact.ListTagsOK
var projectName, repoName, reference string

if len(fuzzy) != 0 || len(match) != 0 || len(ranges) != 0 {
q, qErr := utils.BuildQueryParam(fuzzy, match, ranges,
[]string{"id", "repository_id", "artifact_id", "name", "immutable"},
)
if qErr != nil {
log.Errorf("error while building query parameter: %v", qErr)
return
}

opts.Q = q
Comment thread
Mujib-Ahasan marked this conversation as resolved.
}

if len(args) > 0 {
projectName, repoName, reference, err = utils.ParseProjectRepoReference(args[0])
if err != nil {
log.Errorf("failed to parse project/repo/reference: %v", err)
}
} else {
projectName, err = prompt.GetProjectNameFromUser()
if err != nil {
log.Errorf("failed to get project name: %v", utils.ParseHarborErrorMsg(err))
}
repoName = prompt.GetRepoNameFromUser(projectName)
if repoName == "" {
return
}
reference = prompt.GetReferenceFromUser(repoName, projectName)
}

tags, err = api.ListTags(projectName, repoName, reference, opts)

if err != nil {
log.Errorf("failed to list tags: %v", err)
return
}

FormatFlag := viper.GetString("output-format")
if FormatFlag != "" {
err = utils.PrintFormat(tags, FormatFlag)
if err != nil {
log.Error(err)
return
}
} else {
list.ListTags(tags.Payload)
}
},
}

flags := cmd.Flags()
flags.StringVarP(&opts.Q, "query", "q", "", "Query string to query resources")
flags.StringSliceVar(&fuzzy, "fuzzy", nil, "Fuzzy match filter (key=value)")
flags.StringSliceVar(&match, "match", nil, "exact match filter (key=value)")
flags.StringSliceVar(&ranges, "range", nil, "range filter (key=min~max)")

return cmd
}

func DeleteTagsCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "delete",
Short: "Delete a tag of an artifact",
Example: `harbor artifact tags delete <project>/<repository>/<reference> <tag>`,
Run: func(cmd *cobra.Command, args []string) {
var err error
var projectName, repoName, reference string
var tagName string
if len(args) > 0 {
projectName, repoName, reference, err = utils.ParseProjectRepoReference(args[0])
if err != nil {
log.Errorf("failed to parse project/repo/reference: %v", err)
}
tagName = args[1]
} else {
projectName, err = prompt.GetProjectNameFromUser()
if err != nil {
log.Errorf("failed to get project name: %v", utils.ParseHarborErrorMsg(err))
}
repoName = prompt.GetRepoNameFromUser(projectName)
reference = prompt.GetReferenceFromUser(repoName, projectName)
tagName = prompt.GetTagFromUser(repoName, projectName, reference)
}
err = api.DeleteTag(projectName, repoName, reference, tagName)
if err != nil {
log.Errorf("failed to delete tag: %v", err)
}
},
}

return cmd
}
23 changes: 22 additions & 1 deletion cmd/harbor/root/instance/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,14 @@ import (
)

func ListInstanceCommand() *cobra.Command {
var opts api.ListFlags

var (
opts api.ListFlags
// For querying, opts.Q
fuzzy []string
match []string
ranges []string
)

cmd := &cobra.Command{
Use: "list",
Expand All @@ -43,6 +50,17 @@ This command provides an easy way to view all instances along with their details
return fmt.Errorf("page size should be less than or equal to 100")
}

if len(fuzzy) != 0 || len(match) != 0 || len(ranges) != 0 {
q, qErr := utils.BuildQueryParam(fuzzy, match, ranges,
[]string{"id", "name", "description", "endpoint", "vendor", "status", "enabled", "auth_mode"},
)
if qErr != nil {
return qErr
}
Comment thread
Mujib-Ahasan marked this conversation as resolved.

opts.Q = q
Comment thread
Mujib-Ahasan marked this conversation as resolved.
}

instance, err := api.ListInstance(opts)

if err != nil {
Expand All @@ -66,6 +84,9 @@ This command provides an easy way to view all instances along with their details
flags.Int64VarP(&opts.PageSize, "page-size", "", 10, "Size of per page")
flags.StringVarP(&opts.Q, "query", "q", "", "Query string to query resources")
flags.StringVarP(&opts.Sort, "sort", "", "", "Sort the resource list in ascending or descending order")
flags.StringSliceVar(&fuzzy, "fuzzy", nil, "Fuzzy match filter (key=value)")
flags.StringSliceVar(&match, "match", nil, "exact match filter (key=value)")
flags.StringSliceVar(&ranges, "range", nil, "range filter (key=min~max)")

return cmd
}
33 changes: 25 additions & 8 deletions cmd/harbor/root/project/robot/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,14 @@ import (

// ListRobotCommand creates a new `harbor project robot list` command
func ListRobotCommand() *cobra.Command {
var opts api.ListFlags

var (
opts api.ListFlags
// For querying, opts.Q
fuzzy []string
match []string
ranges []string
)

projectQString := constants.ProjectQString
cmd := &cobra.Command{
Expand Down Expand Up @@ -96,6 +103,19 @@ Examples:
opts.Q = projectQString + strconv.FormatInt(projectID, 10)
}

if len(fuzzy) != 0 || len(match) != 0 || len(ranges) != 0 {
q, qErr := utils.BuildQueryParam(fuzzy, match, ranges,
[]string{"id", "secret", "description", "name", "disable", "level", "duration", "editable"},
)
if qErr != nil {
return qErr
}
if opts.Q != "" {
opts.Q += ","
}
opts.Q += q
Comment thread
Mujib-Ahasan marked this conversation as resolved.
}

robots, err := api.ListRobot(opts)
if err != nil {
log.Errorf("failed to get robots list: %v", err)
Expand All @@ -120,13 +140,10 @@ Examples:
flags.Int64VarP(&opts.PageSize, "page-size", "", 10, "Size of per page")
flags.Int64VarP(&opts.ProjectID, "project-id", "", 0, "Project ID")
flags.StringVarP(&opts.Q, "query", "q", "", "Query string to query resources")
Comment on lines 141 to 142
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No query conversion here

flags.StringVarP(
&opts.Sort,
"sort",
"",
"",
"Sort the resource list in ascending or descending order",
)
flags.StringSliceVar(&fuzzy, "fuzzy", nil, "Fuzzy match filter (key=value)")
flags.StringSliceVar(&match, "match", nil, "exact match filter (key=value)")
flags.StringSliceVar(&ranges, "range", nil, "range filter (key=min~max)")
flags.StringVarP(&opts.Sort, "sort", "", "", "Sort the resource list in ascending or descending order")

return cmd
}
8 changes: 1 addition & 7 deletions cmd/harbor/root/quota/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,13 +65,7 @@ func ListQuotaCommand() *cobra.Command {
flags.Int64VarP(&opts.PageSize, "page-size", "", 0, "Size of per page (use 0 to fetch all)")
flags.StringVarP(&opts.Reference, "ref", "", "", "Reference type of quota")
flags.StringVarP(&opts.ReferenceID, "refid", "", "", "Reference ID of quota")
flags.StringVarP(
&opts.Sort,
"sort",
"",
"",
"Sort the resource list in ascending or descending order",
)
flags.StringVarP(&opts.Sort, "sort", "", "", "Sort the resource list in ascending or descending order")

return cmd
}
23 changes: 22 additions & 1 deletion cmd/harbor/root/registry/list.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,14 @@ import (

// NewListRegistryCommand creates a new `harbor list registry` command
func ListRegistryCommand() *cobra.Command {
var opts api.ListFlags

var (
opts api.ListFlags
// For querying, opts.Q
fuzzy []string
match []string
ranges []string
)

cmd := &cobra.Command{
Use: "list",
Expand All @@ -40,6 +47,17 @@ func ListRegistryCommand() *cobra.Command {
if opts.PageSize > 100 {
return fmt.Errorf("page size should be less than or equal to 100")
}

if len(fuzzy) != 0 || len(match) != 0 || len(ranges) != 0 {
q, qErr := utils.BuildQueryParam(fuzzy, match, ranges,
[]string{"id", "url", "name", "type", "description", "status", "creation_time"},
)
if qErr != nil {
return qErr
}

opts.Q = q
}
registry, err := api.ListRegistries(opts)

if err != nil {
Expand Down Expand Up @@ -67,6 +85,9 @@ func ListRegistryCommand() *cobra.Command {
flags.Int64VarP(&opts.PageSize, "page-size", "", 10, "Size of per page")
flags.StringVarP(&opts.Q, "query", "q", "", "Query string to query resources")
flags.StringVarP(&opts.Sort, "sort", "", "", "Sort the resource list in ascending or descending order")
flags.StringSliceVar(&fuzzy, "fuzzy", nil, "Fuzzy match filter (key=value)")
flags.StringSliceVar(&match, "match", nil, "exact match filter (key=value)")
flags.StringSliceVar(&ranges, "range", nil, "range filter (key=min~max)")

return cmd
}
Loading
Loading