diff --git a/cmd/harbor/root/artifact/cmd.go b/cmd/harbor/root/artifact/cmd.go index 9ae56ba1..8f9c66d2 100644 --- a/cmd/harbor/root/artifact/cmd.go +++ b/cmd/harbor/root/artifact/cmd.go @@ -15,7 +15,7 @@ func Artifact() *cobra.Command { cmd.AddCommand( ListArtifactCommand(), - InfoArtifactCommmand(), + ViewArtifactCommmand(), DeleteArtifactCommand(), ScanArtifactCommand(), ArtifactTagsCmd(), diff --git a/cmd/harbor/root/artifact/info.go b/cmd/harbor/root/artifact/info.go deleted file mode 100644 index b215d91a..00000000 --- a/cmd/harbor/root/artifact/info.go +++ /dev/null @@ -1,39 +0,0 @@ -package artifact - -import ( - "github.com/goharbor/harbor-cli/pkg/api" - "github.com/goharbor/harbor-cli/pkg/prompt" - "github.com/goharbor/harbor-cli/pkg/utils" - log "github.com/sirupsen/logrus" - "github.com/spf13/cobra" -) - -func InfoArtifactCommmand() *cobra.Command { - - cmd := &cobra.Command{ - Use: "info", - Short: "Get info of an artifact", - Long: `Get info of an artifact`, - Example: `harbor artifact info //`, - Run: func(cmd *cobra.Command, args []string) { - var err error - - if len(args) > 0 { - projectName, repoName, reference := utils.ParseProjectRepoReference(args[0]) - err = api.InfoArtifact(projectName, repoName, reference) - } else { - projectName := prompt.GetProjectNameFromUser() - repoName := prompt.GetRepoNameFromUser(projectName) - reference := prompt.GetReferenceFromUser(repoName, projectName) - err = api.InfoArtifact(projectName, repoName, reference) - } - - if err != nil { - log.Errorf("failed to get info of an artifact: %v", err) - } - - }, - } - - return cmd -} diff --git a/cmd/harbor/root/artifact/list.go b/cmd/harbor/root/artifact/list.go index 5c6fb33f..c378f05e 100644 --- a/cmd/harbor/root/artifact/list.go +++ b/cmd/harbor/root/artifact/list.go @@ -8,6 +8,7 @@ import ( artifactViews "github.com/goharbor/harbor-cli/pkg/views/artifact/list" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "github.com/spf13/viper" ) func ListArtifactCommand() *cobra.Command { @@ -19,21 +20,31 @@ func ListArtifactCommand() *cobra.Command { Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { var err error - var resp artifact.ListArtifactsOK + var artifacts artifact.ListArtifactsOK + var projectName, repoName string if len(args) > 0 { - projectName, repoName := utils.ParseProjectRepo(args[0]) - resp, err = api.ListArtifact(projectName, repoName, opts) + projectName, repoName = utils.ParseProjectRepo(args[0]) } else { - projectName := prompt.GetProjectNameFromUser() - repoName := prompt.GetRepoNameFromUser(projectName) - resp, err = api.ListArtifact(projectName, repoName, opts) + projectName = prompt.GetProjectNameFromUser() + repoName = prompt.GetRepoNameFromUser(projectName) } + artifacts, err = api.ListArtifact(projectName, repoName, opts) + if err != nil { log.Errorf("failed to list artifacts: %v", err) } - artifactViews.ListArtifacts(resp.Payload) + + FormatFlag := viper.GetString("output-format") + if FormatFlag != "" { + err = utils.PrintFormat(artifacts, FormatFlag) + if err != nil { + log.Error(err) + } + } else { + artifactViews.ListArtifacts(artifacts.Payload) + } }, } diff --git a/cmd/harbor/root/artifact/tags.go b/cmd/harbor/root/artifact/tags.go index f5b582d2..a213b3c7 100644 --- a/cmd/harbor/root/artifact/tags.go +++ b/cmd/harbor/root/artifact/tags.go @@ -6,8 +6,10 @@ import ( "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 { @@ -62,22 +64,35 @@ func ListTagsCmd() *cobra.Command { Example: `harbor artifact tags list //`, Run: func(cmd *cobra.Command, args []string) { var err error + var tags *artifact.ListTagsOK + var projectName, repoName, reference string - var resp artifact.ListTagsOK if len(args) > 0 { - projectName, repoName, reference := utils.ParseProjectRepoReference(args[0]) - resp, err = api.ListTags(projectName, repoName, reference) + projectName, repoName, reference = utils.ParseProjectRepoReference(args[0]) } else { - projectName := prompt.GetProjectNameFromUser() - repoName := prompt.GetRepoNameFromUser(projectName) - reference := prompt.GetReferenceFromUser(repoName, projectName) - resp, err = api.ListTags(projectName, repoName, reference) + projectName = prompt.GetProjectNameFromUser() + repoName = prompt.GetRepoNameFromUser(projectName) + reference = prompt.GetReferenceFromUser(repoName, projectName) } + + tags, err = api.ListTags(projectName, repoName, reference) + 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) } - log.Info(resp.Payload) }, } diff --git a/cmd/harbor/root/artifact/view.go b/cmd/harbor/root/artifact/view.go new file mode 100644 index 00000000..7d13c0f6 --- /dev/null +++ b/cmd/harbor/root/artifact/view.go @@ -0,0 +1,55 @@ +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/view" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +func ViewArtifactCommmand() *cobra.Command { + + cmd := &cobra.Command{ + Use: "view", + Short: "Get information of an artifact", + Long: `Get information of an artifact`, + Example: `harbor artifact view //`, + Run: func(cmd *cobra.Command, args []string) { + var err error + var projectName, repoName, reference string + var artifact *artifact.GetArtifactOK + + if len(args) > 0 { + projectName, repoName, reference = utils.ParseProjectRepoReference(args[0]) + } else { + projectName = prompt.GetProjectNameFromUser() + repoName = prompt.GetRepoNameFromUser(projectName) + reference = prompt.GetReferenceFromUser(repoName, projectName) + } + + artifact, err = api.ViewArtifact(projectName, repoName, reference) + + if err != nil { + log.Errorf("failed to get info of an artifact: %v", err) + } + + FormatFlag := viper.GetString("output-format") + if FormatFlag != "" { + err = utils.PrintFormat(artifact, FormatFlag) + if err != nil { + log.Error(err) + return + } + } else { + view.ViewArtifact(artifact.Payload) + } + + }, + } + + return cmd +} diff --git a/cmd/harbor/root/project/list.go b/cmd/harbor/root/project/list.go index 71f18de2..3a908b42 100644 --- a/cmd/harbor/root/project/list.go +++ b/cmd/harbor/root/project/list.go @@ -37,11 +37,13 @@ func ListProjectCommand() *cobra.Command { } FormatFlag := viper.GetString("output-format") if FormatFlag != "" { - utils.PrintPayloadInJSONFormat(projects) - return + err = utils.PrintFormat(projects, FormatFlag) + if err != nil { + log.Error(err) + } + } else { + list.ListProjects(projects.Payload) } - - list.ListProjects(projects.Payload) }, } diff --git a/cmd/harbor/root/project/logs.go b/cmd/harbor/root/project/logs.go index 6ee330db..8e4cac54 100644 --- a/cmd/harbor/root/project/logs.go +++ b/cmd/harbor/root/project/logs.go @@ -30,12 +30,15 @@ func LogsProjectCommmand() *cobra.Command { if err != nil { log.Fatalf("failed to get project logs: %v", err) } - auditLog.LogsProject(resp.Payload) FormatFlag := viper.GetString("output-format") if FormatFlag != "" { - utils.PrintPayloadInJSONFormat(resp) - return + err = utils.PrintFormat(resp, FormatFlag) + if err != nil { + log.Error(err) + } + } else { + auditLog.LogsProject(resp.Payload) } }, diff --git a/cmd/harbor/root/project/view.go b/cmd/harbor/root/project/view.go index 908d51d8..7d7addc4 100644 --- a/cmd/harbor/root/project/view.go +++ b/cmd/harbor/root/project/view.go @@ -1,10 +1,14 @@ package project import ( + "github.com/goharbor/go-client/pkg/sdk/v2.0/client/project" "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/project/view" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "github.com/spf13/viper" ) // GetProjectCommand creates a new `harbor get project` command @@ -16,16 +20,31 @@ func ViewCommand() *cobra.Command { Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { var err error + var projectName string + var project *project.GetProjectOK if len(args) > 0 { - err = api.GetProject(args[0]) + projectName = args[0] } else { - projectName := prompt.GetProjectNameFromUser() - err = api.GetProject(projectName) + projectName = prompt.GetProjectNameFromUser() } + project, err = api.GetProject(projectName) + if err != nil { log.Errorf("failed to get project: %v", err) + return + } + + FormatFlag := viper.GetString("output-format") + if FormatFlag != "" { + err = utils.PrintFormat(project, FormatFlag) + if err != nil { + log.Error(err) + return + } + } else { + view.ViewProjects(project.Payload) } }, diff --git a/cmd/harbor/root/registry/cmd.go b/cmd/harbor/root/registry/cmd.go index 9f42d761..3f9d2e26 100644 --- a/cmd/harbor/root/registry/cmd.go +++ b/cmd/harbor/root/registry/cmd.go @@ -13,7 +13,7 @@ func Registry() *cobra.Command { } cmd.AddCommand( CreateRegistryCommand(), - InfoRegistryCommand(), + ViewRegistryCommand(), DeleteRegistryCommand(), ListRegistryCommand(), UpdateRegistryCommand(), diff --git a/cmd/harbor/root/registry/info.go b/cmd/harbor/root/registry/info.go deleted file mode 100644 index 97a16799..00000000 --- a/cmd/harbor/root/registry/info.go +++ /dev/null @@ -1,34 +0,0 @@ -package registry - -import ( - "github.com/goharbor/harbor-cli/pkg/api" - "github.com/goharbor/harbor-cli/pkg/prompt" - log "github.com/sirupsen/logrus" - "github.com/spf13/cobra" -) - -func InfoRegistryCommand() *cobra.Command { - cmd := &cobra.Command{ - Use: "info", - Short: "get registry info", - Example: "harbor registry info [registryname]", - Args: cobra.MaximumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - var err error - - if len(args) > 0 { - registryName, _ := api.GetRegistryIdByName(args[0]) - err = api.InfoRegistry(registryName) - } else { - registryId := prompt.GetRegistryNameFromUser() - err = api.InfoRegistry(registryId) - } - if err != nil { - log.Errorf("failed to get registry info: %v", err) - } - - }, - } - - return cmd -} diff --git a/cmd/harbor/root/registry/list.go b/cmd/harbor/root/registry/list.go index 21862779..78598511 100644 --- a/cmd/harbor/root/registry/list.go +++ b/cmd/harbor/root/registry/list.go @@ -24,10 +24,13 @@ func ListRegistryCommand() *cobra.Command { } FormatFlag := viper.GetString("output-format") if FormatFlag != "" { - utils.PrintPayloadInJSONFormat(registry) - return + err = utils.PrintFormat(registry, FormatFlag) + if err != nil { + log.Error(err) + } + } else { + list.ListRegistry(registry.Payload) } - list.ListRegistry(registry.Payload) }, } diff --git a/cmd/harbor/root/registry/view.go b/cmd/harbor/root/registry/view.go new file mode 100644 index 00000000..f7910971 --- /dev/null +++ b/cmd/harbor/root/registry/view.go @@ -0,0 +1,56 @@ +package registry + +import ( + "github.com/goharbor/go-client/pkg/sdk/v2.0/client/registry" + "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/registry/view" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +func ViewRegistryCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "view", + Short: "get registry information", + Example: "harbor registry view [registryName]", + Args: cobra.MaximumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + var err error + var registryId int64 + var registry *registry.GetRegistryOK + + if len(args) > 0 { + registryId, err = api.GetRegistryIdByName(args[0]) + if err != nil { + log.Errorf("failed to get registry name by id: %v", err) + return + } + } else { + registryId = prompt.GetRegistryNameFromUser() + } + + registry, err = api.ViewRegistry(registryId) + + if err != nil { + log.Errorf("failed to get registry info: %v", err) + return + } + + FormatFlag := viper.GetString("output-format") + if FormatFlag != "" { + err = utils.PrintFormat(registry, FormatFlag) + if err != nil { + log.Error(err) + } + } else { + view.ViewRegistry(registry.Payload) + } + + }, + } + + return cmd +} diff --git a/cmd/harbor/root/repository/cmd.go b/cmd/harbor/root/repository/cmd.go index f5144078..c9da6a63 100644 --- a/cmd/harbor/root/repository/cmd.go +++ b/cmd/harbor/root/repository/cmd.go @@ -10,7 +10,7 @@ func Repository() *cobra.Command { } cmd.AddCommand( ListRepositoryCommand(), - RepoInfoCmd(), + RepoViewCmd(), RepoDeleteCmd(), SearchRepoCmd(), ) diff --git a/cmd/harbor/root/repository/info.go b/cmd/harbor/root/repository/info.go deleted file mode 100644 index 6a54da71..00000000 --- a/cmd/harbor/root/repository/info.go +++ /dev/null @@ -1,35 +0,0 @@ -package repository - -import ( - "github.com/goharbor/harbor-cli/pkg/api" - "github.com/goharbor/harbor-cli/pkg/prompt" - "github.com/goharbor/harbor-cli/pkg/utils" - log "github.com/sirupsen/logrus" - "github.com/spf13/cobra" -) - -func RepoInfoCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "info", - Short: "Get repository information", - Example: ` harbor repo info /`, - Long: `Get information of a particular repository in a project`, - Run: func(cmd *cobra.Command, args []string) { - var err error - if len(args) > 0 { - projectName, repoName := utils.ParseProjectRepo(args[0]) - err = api.RepoInfo(projectName, repoName) - } else { - projectName := prompt.GetProjectNameFromUser() - repoName := prompt.GetRepoNameFromUser(projectName) - err = api.RepoInfo(projectName, repoName) - } - if err != nil { - log.Errorf("failed to get repository information: %v", err) - } - - }, - } - - return cmd -} diff --git a/cmd/harbor/root/repository/list.go b/cmd/harbor/root/repository/list.go index e9f1126c..41ca0492 100644 --- a/cmd/harbor/root/repository/list.go +++ b/cmd/harbor/root/repository/list.go @@ -4,33 +4,46 @@ import ( "github.com/goharbor/go-client/pkg/sdk/v2.0/client/repository" "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/repository/list" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" + "github.com/spf13/viper" ) func ListRepositoryCommand() *cobra.Command { cmd := &cobra.Command{ - Use: "list", - Short: "list repositories within a project", - Args: cobra.MaximumNArgs(1), + Use: "list", + Short: "list repositories within a project", + Example: ` harbor repo list `, + Long: `Get information of all repositories in a project`, + Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { var err error - var resp repository.ListRepositoriesOK + var repos repository.ListRepositoriesOK + var projectName string if len(args) > 0 { - resp, err = api.ListRepository(args[0]) + projectName = args[0] } else { - projectName := prompt.GetProjectNameFromUser() - resp, err = api.ListRepository(projectName) + projectName = prompt.GetProjectNameFromUser() } + repos, err = api.ListRepository(projectName) + if err != nil { log.Errorf("failed to list repositories: %v", err) } - list.ListRepositories(resp.Payload) - + FormatFlag := viper.GetString("output-format") + if FormatFlag != "" { + err = utils.PrintFormat(repos, FormatFlag) + if err != nil { + log.Error(err) + } + } else { + list.ListRepositories(repos.Payload) + } }, } diff --git a/cmd/harbor/root/repository/view.go b/cmd/harbor/root/repository/view.go new file mode 100644 index 00000000..463387df --- /dev/null +++ b/cmd/harbor/root/repository/view.go @@ -0,0 +1,54 @@ +package repository + +import ( + "github.com/goharbor/go-client/pkg/sdk/v2.0/client/repository" + "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/repository/view" + log "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +func RepoViewCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: "view", + Short: "Get repository information", + Example: ` harbor repo view /`, + Long: `Get information of a particular repository in a project`, + Run: func(cmd *cobra.Command, args []string) { + var err error + var projectName, repoName string + var repo *repository.GetRepositoryOK + + if len(args) > 0 { + projectName, repoName = utils.ParseProjectRepo(args[0]) + } else { + projectName = prompt.GetProjectNameFromUser() + repoName = prompt.GetRepoNameFromUser(projectName) + } + + repo, err = api.RepoView(projectName, repoName) + + if err != nil { + log.Errorf("failed to get repository information: %v", err) + return + } + + FormatFlag := viper.GetString("output-format") + if FormatFlag != "" { + err = utils.PrintFormat(repo, FormatFlag) + if err != nil { + log.Error(err) + return + } + } else { + view.ViewRepository(repo.Payload) + } + + }, + } + + return cmd +} diff --git a/cmd/harbor/root/user/list.go b/cmd/harbor/root/user/list.go index d8a81aab..9a7999e9 100644 --- a/cmd/harbor/root/user/list.go +++ b/cmd/harbor/root/user/list.go @@ -25,7 +25,10 @@ func UserListCmd() *cobra.Command { } FormatFlag := viper.GetString("output-format") if FormatFlag != "" { - utils.PrintPayloadInJSONFormat(response.Payload) + err = utils.PrintFormat(response, FormatFlag) + if err != nil { + log.Error(err) + } } else { list.ListUsers(response.Payload) } diff --git a/pkg/api/artifact_handler.go b/pkg/api/artifact_handler.go index a6fa1391..d79eba44 100644 --- a/pkg/api/artifact_handler.go +++ b/pkg/api/artifact_handler.go @@ -30,24 +30,25 @@ func DeleteArtifact(projectName, repoName, reference string) error { } // InfoArtifact retrieves information about a specific artifact. -func InfoArtifact(projectName, repoName, reference string) error { +func ViewArtifact(projectName, repoName, reference string) (*artifact.GetArtifactOK, error) { ctx, client, err := utils.ContextWithClient() + var response = &artifact.GetArtifactOK{} if err != nil { - return err + return response, err } - response, err := client.Artifact.GetArtifact(ctx, &artifact.GetArtifactParams{ + response, err = client.Artifact.GetArtifact(ctx, &artifact.GetArtifactParams{ ProjectName: projectName, RepositoryName: repoName, Reference: reference, }) + if err != nil { log.Errorf("Failed to get artifact info: %v", err) - return err + return response, err } - utils.PrintPayloadInJSONFormat(response.Payload) - return nil + return response, nil } // RunListArtifact lists all artifacts in a repository. @@ -141,10 +142,10 @@ func DeleteTag(projectName, repoName, reference, tag string) error { } // ListTags lists all tags of a specific artifact. -func ListTags(projectName, repoName, reference string) (artifact.ListTagsOK, error) { +func ListTags(projectName, repoName, reference string) (*artifact.ListTagsOK, error) { ctx, client, err := utils.ContextWithClient() if err != nil { - return artifact.ListTagsOK{}, err + return &artifact.ListTagsOK{}, err } resp, err := client.Artifact.ListTags(ctx, &artifact.ListTagsParams{ @@ -152,12 +153,13 @@ func ListTags(projectName, repoName, reference string) (artifact.ListTagsOK, err RepositoryName: repoName, Reference: reference, }) + if err != nil { log.Errorf("Failed to list tags: %v", err) - return artifact.ListTagsOK{}, err + return &artifact.ListTagsOK{}, err } - return *resp, nil + return resp, nil } // CreateTag creates a tag for a specific artifact. diff --git a/pkg/api/project_handler.go b/pkg/api/project_handler.go index 5ebb3df2..476aafbf 100644 --- a/pkg/api/project_handler.go +++ b/pkg/api/project_handler.go @@ -39,20 +39,21 @@ func CreateProject(opts create.CreateView) error { return nil } -func GetProject(projectName string) error { +func GetProject(projectName string) (*project.GetProjectOK, error) { ctx, client, err := utils.ContextWithClient() + var response = &project.GetProjectOK{} + if err != nil { - return err + return response, err } - response, err := client.Project.GetProject(ctx, &project.GetProjectParams{ProjectNameOrID: projectName}) + response, err = client.Project.GetProject(ctx, &project.GetProjectParams{ProjectNameOrID: projectName}) if err != nil { - return err + return response, err } - utils.PrintPayloadInJSONFormat(response) - return nil + return response, nil } func DeleteProject(projectName string) error { diff --git a/pkg/api/registry_handler.go b/pkg/api/registry_handler.go index e3a341cb..0df427fc 100644 --- a/pkg/api/registry_handler.go +++ b/pkg/api/registry_handler.go @@ -81,22 +81,23 @@ func DeleteRegistry(registryName int64) error { return nil } -func InfoRegistry(registryId int64) error { +func ViewRegistry(registryId int64) (*registry.GetRegistryOK, error) { ctx, client, err := utils.ContextWithClient() + var response = ®istry.GetRegistryOK{} if err != nil { - return err + return response, err } - response, err := client.Registry.GetRegistry(ctx, ®istry.GetRegistryParams{ID: registryId}) + response, err = client.Registry.GetRegistry(ctx, ®istry.GetRegistryParams{ID: registryId}) + if err != nil { - return err + return response, err } if response.Payload.ID == 0 { - return fmt.Errorf("registry is not found") + return response, fmt.Errorf("registry is not found") } - utils.PrintPayloadInJSONFormat(response.Payload) - return nil + return response, nil } func UpdateRegistry(updateView *CreateRegView, projectID int64) error { diff --git a/pkg/api/repository_handler.go b/pkg/api/repository_handler.go index 187c174c..479fdd1f 100644 --- a/pkg/api/repository_handler.go +++ b/pkg/api/repository_handler.go @@ -22,20 +22,20 @@ func RepoDelete(projectName, repoName string) error { return nil } -func RepoInfo(projectName, repoName string) error { +func RepoView(projectName, repoName string) (*repository.GetRepositoryOK, error) { ctx, client, err := utils.ContextWithClient() + var response = &repository.GetRepositoryOK{} if err != nil { - return err + return response, err } - response, err := client.Repository.GetRepository(ctx, &repository.GetRepositoryParams{ProjectName: projectName, RepositoryName: repoName}) + response, err = client.Repository.GetRepository(ctx, &repository.GetRepositoryParams{ProjectName: projectName, RepositoryName: repoName}) if err != nil { - return err + return response, err } - utils.PrintPayloadInJSONFormat(response.Payload) - return nil + return response, nil } func ListRepository(projectName string) (repository.ListRepositoriesOK, error) { diff --git a/pkg/utils/helper.go b/pkg/utils/helper.go index 31f06c9b..2c6b3e53 100644 --- a/pkg/utils/helper.go +++ b/pkg/utils/helper.go @@ -122,3 +122,15 @@ func ValidateRegistryName(rn string) bool { return re.MatchString(rn) } + +func PrintFormat[T any](resp T, format string) error { + if format == "json" { + PrintPayloadInJSONFormat(resp) + return nil + } + if format == "yaml" { + PrintPayloadInYAMLFormat(resp) + return nil + } + return fmt.Errorf("unable to output in the specified '%s' format", format) +} diff --git a/pkg/utils/utils.go b/pkg/utils/utils.go index db99de76..5bff7837 100644 --- a/pkg/utils/utils.go +++ b/pkg/utils/utils.go @@ -7,6 +7,7 @@ import ( "strings" log "github.com/sirupsen/logrus" + "gopkg.in/yaml.v3" ) // Returns Harbor v2 client for given clientConfig @@ -24,6 +25,19 @@ func PrintPayloadInJSONFormat(payload any) { fmt.Println(string(jsonStr)) } +func PrintPayloadInYAMLFormat(payload any) { + if payload == nil { + return + } + + yamlStr, err := yaml.Marshal(payload) + if err != nil { + panic(err) + } + + fmt.Println(string(yamlStr)) +} + func ParseProjectRepo(projectRepo string) (string, string) { split := strings.Split(projectRepo, "/") if len(split) != 2 { diff --git a/pkg/views/artifact/tags/list/view.go b/pkg/views/artifact/tags/list/view.go new file mode 100644 index 00000000..f20491b5 --- /dev/null +++ b/pkg/views/artifact/tags/list/view.go @@ -0,0 +1,39 @@ +package list + +import ( + "fmt" + "os" + + "github.com/charmbracelet/bubbles/table" + tea "github.com/charmbracelet/bubbletea" + "github.com/goharbor/go-client/pkg/sdk/v2.0/models" + "github.com/goharbor/harbor-cli/pkg/utils" + "github.com/goharbor/harbor-cli/pkg/views/base/tablelist" +) + +var columns = []table.Column{ + {Title: "Name", Width: 12}, + {Title: "Pull Time", Width: 30}, + {Title: "Push Time", Width: 30}, +} + +func ListTags(tags []*models.Tag) { + var rows []table.Row + for _, tag := range tags { + + pullTime, _ := utils.FormatCreatedTime(tag.PullTime.String()) + pushTime, _ := utils.FormatCreatedTime(tag.PushTime.String()) + rows = append(rows, table.Row{ + tag.Name, + pullTime, + pushTime, + }) + } + + m := tablelist.NewModel(columns, rows, len(rows)) + + if _, err := tea.NewProgram(m).Run(); err != nil { + fmt.Println("Error running program:", err) + os.Exit(1) + } +} diff --git a/pkg/views/artifact/view/view.go b/pkg/views/artifact/view/view.go new file mode 100644 index 00000000..0ab46ae7 --- /dev/null +++ b/pkg/views/artifact/view/view.go @@ -0,0 +1,47 @@ +package view + +import ( + "fmt" + "github.com/charmbracelet/bubbles/table" + tea "github.com/charmbracelet/bubbletea" + "github.com/goharbor/go-client/pkg/sdk/v2.0/models" + "github.com/goharbor/harbor-cli/pkg/utils" + "github.com/goharbor/harbor-cli/pkg/views/base/tablelist" + "os" + "strconv" +) + +var columns = []table.Column{ + {Title: "ID", Width: 6}, + {Title: "Artifact Digest", Width: 20}, + {Title: "Type", Width: 12}, + {Title: "Size", Width: 12}, + {Title: "Vulnerabilities", Width: 15}, + {Title: "Push Time", Width: 12}, +} + +func ViewArtifact(artifact *models.Artifact) { + var rows []table.Row + + pushTime, _ := utils.FormatCreatedTime(artifact.PushTime.String()) + artifactSize := utils.FormatSize(artifact.Size) + var totalVulnerabilities int64 + for _, scan := range artifact.ScanOverview { + totalVulnerabilities += scan.Summary.Total + } + rows = append(rows, table.Row{ + strconv.FormatInt(int64(artifact.ID), 10), + artifact.Digest[:16], + artifact.Type, + artifactSize, + strconv.FormatInt(totalVulnerabilities, 10), + pushTime, + }) + + m := tablelist.NewModel(columns, rows, len(rows)) + + if _, err := tea.NewProgram(m).Run(); err != nil { + fmt.Println("Error running program:", err) + os.Exit(1) + } +} diff --git a/pkg/views/project/view/view.go b/pkg/views/project/view/view.go new file mode 100644 index 00000000..66e2b937 --- /dev/null +++ b/pkg/views/project/view/view.go @@ -0,0 +1,52 @@ +package view + +import ( + "fmt" + "os" + "strconv" + + "github.com/charmbracelet/bubbles/table" + tea "github.com/charmbracelet/bubbletea" + "github.com/goharbor/go-client/pkg/sdk/v2.0/models" + "github.com/goharbor/harbor-cli/pkg/utils" + "github.com/goharbor/harbor-cli/pkg/views/base/tablelist" +) + +var columns = []table.Column{ + {Title: "Project ID", Width: 10}, + {Title: "Project Name", Width: 12}, + {Title: "Access Level", Width: 12}, + {Title: "Type", Width: 12}, + {Title: "Repo Count", Width: 12}, + {Title: "Creation Time", Width: 15}, +} + +func ViewProjects(project *models.Project) { + var rows []table.Row + accessLevel := "public" + if project.Metadata.Public != "true" { + accessLevel = "private" + } + + projectType := "project" + + if project.RegistryID != 0 { + projectType = "proxy cache" + } + createdTime, _ := utils.FormatCreatedTime(project.CreationTime.String()) + rows = append(rows, table.Row{ + strconv.FormatInt(int64(project.ProjectID), 10), // ProjectID + project.Name, // Project Name + accessLevel, // Access Level + projectType, // Type + strconv.FormatInt(project.RepoCount, 10), + createdTime, // Creation Time, + }) + + m := tablelist.NewModel(columns, rows, len(rows)) + + if _, err := tea.NewProgram(m).Run(); err != nil { + fmt.Println("Error running program:", err) + os.Exit(1) + } +} diff --git a/pkg/views/registry/view/view.go b/pkg/views/registry/view/view.go new file mode 100644 index 00000000..f792b930 --- /dev/null +++ b/pkg/views/registry/view/view.go @@ -0,0 +1,43 @@ +package view + +import ( + "fmt" + "os" + + "github.com/charmbracelet/bubbles/table" + tea "github.com/charmbracelet/bubbletea" + "github.com/goharbor/go-client/pkg/sdk/v2.0/models" + "github.com/goharbor/harbor-cli/pkg/utils" + "github.com/goharbor/harbor-cli/pkg/views/base/tablelist" +) + +var columns = []table.Column{ + {Title: "ID", Width: 5}, + {Title: "Name", Width: 10}, + {Title: "Status", Width: 10}, + {Title: "Endpoint URL", Width: 20}, + {Title: "Provider", Width: 15}, + {Title: "Creation Time", Width: 15}, + {Title: "Description", Width: 20}, +} + +func ViewRegistry(registry *models.Registry) { + var rows []table.Row + createdTime, _ := utils.FormatCreatedTime(registry.CreationTime.String()) + rows = append(rows, table.Row{ + fmt.Sprintf("%d", registry.ID), + registry.Name, + registry.Status, + registry.URL, + registry.Type, + createdTime, + registry.Description, + }) + + m := tablelist.NewModel(columns, rows, len(rows)) + + if _, err := tea.NewProgram(m).Run(); err != nil { + fmt.Println("Error running program:", err) + os.Exit(1) + } +} diff --git a/pkg/views/repository/view/view.go b/pkg/views/repository/view/view.go new file mode 100644 index 00000000..0b5944b5 --- /dev/null +++ b/pkg/views/repository/view/view.go @@ -0,0 +1,47 @@ +package view + +import ( + "fmt" + "os" + "strconv" + + "github.com/charmbracelet/bubbles/table" + tea "github.com/charmbracelet/bubbletea" + "github.com/goharbor/go-client/pkg/sdk/v2.0/models" + "github.com/goharbor/harbor-cli/pkg/utils" + "github.com/goharbor/harbor-cli/pkg/views/base/tablelist" +) + +var columns = []table.Column{ + {Title: "Name", Width: 20}, + {Title: "ID", Width: 10}, + {Title: "Project ID", Width: 10}, + {Title: "Artifacts", Width: 10}, + {Title: "Pulls", Width: 5}, + {Title: "Creation Time", Width: 20}, + {Title: "Last Modified Time", Width: 20}, + {Title: "Description", Width: 20}, +} + +func ViewRepository(repo *models.Repository) { + var rows []table.Row + + createdTime, _ := utils.FormatCreatedTime(repo.CreationTime.String()) + modifledTime, _ := utils.FormatCreatedTime(repo.UpdateTime.String()) + rows = append(rows, table.Row{ + repo.Name, + fmt.Sprintf("%d", repo.ID), + fmt.Sprintf("%d", repo.ProjectID), + fmt.Sprintf("%d", repo.ArtifactCount), + strconv.FormatInt(repo.PullCount, 10), + createdTime, + modifledTime, + repo.Description, + }) + + m := tablelist.NewModel(columns, rows, len(rows)) + if _, err := tea.NewProgram(m).Run(); err != nil { + fmt.Println("Error running program:", err) + os.Exit(1) + } +}