Skip to content

Commit

Permalink
Refactor podman search to be more code friendly
Browse files Browse the repository at this point in the history
* JSON and API description fields are no longer truncated. Formatting
  moved to client, better support of MVP.
* --no-trunc now defaults to true
* Updated tests for changes

Closes containers#11894

Signed-off-by: Jhon Honce <[email protected]>
  • Loading branch information
jwhonce committed Oct 12, 2021
1 parent 2fcec59 commit b28a8bc
Show file tree
Hide file tree
Showing 10 changed files with 42 additions and 41 deletions.
22 changes: 16 additions & 6 deletions cmd/podman/images/search.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package images
import (
"fmt"
"os"
"strings"

"github.com/containers/common/pkg/auth"
"github.com/containers/common/pkg/completion"
Expand Down Expand Up @@ -79,7 +80,7 @@ func searchFlags(cmd *cobra.Command) {

filterFlagName := "filter"
flags.StringSliceVarP(&searchOptions.Filters, filterFlagName, "f", []string{}, "Filter output based on conditions provided (default [])")
//TODO add custom filter function
// TODO add custom filter function
_ = cmd.RegisterFlagCompletionFunc(filterFlagName, completion.AutocompleteNone)

formatFlagName := "format"
Expand All @@ -90,7 +91,7 @@ func searchFlags(cmd *cobra.Command) {
flags.IntVar(&searchOptions.Limit, limitFlagName, 0, "Limit the number of results")
_ = cmd.RegisterFlagCompletionFunc(limitFlagName, completion.AutocompleteNone)

flags.BoolVar(&searchOptions.NoTrunc, "no-trunc", false, "Do not truncate the output")
flags.Bool("no-trunc", true, "Do not truncate the output. Default: true")

authfileFlagName := "authfile"
flags.StringVar(&searchOptions.Authfile, authfileFlagName, auth.GetDefaultAuthFile(), "Path of the authentication file. Use REGISTRY_AUTH_FILE environment variable to override")
Expand Down Expand Up @@ -132,11 +133,20 @@ func imageSearch(cmd *cobra.Command, args []string) error {
if err != nil {
return err
}

if len(searchReport) == 0 {
return nil
}

noTrunc, _ := cmd.Flags().GetBool("no-trunc")
isJSON := report.IsJSON(searchOptions.Format)
for i, element := range searchReport {
d := strings.ReplaceAll(element.Description, "\n", " ")
if len(d) > 44 && !(noTrunc || isJSON) {
d = strings.TrimSpace(d[:44]) + "..."
}
searchReport[i].Description = d
}

hdrs := report.Headers(entities.ImageSearchReport{}, nil)
renderHeaders := true
var row string
Expand All @@ -145,12 +155,12 @@ func imageSearch(cmd *cobra.Command, args []string) error {
if len(searchOptions.Filters) != 0 {
return errors.Errorf("filters are not applicable to list tags result")
}
if report.IsJSON(searchOptions.Format) {
if isJSON {
listTagsEntries := buildListTagsJSON(searchReport)
return printArbitraryJSON(listTagsEntries)
}
row = "{{.Name}}\t{{.Tag}}\n"
case report.IsJSON(searchOptions.Format):
case isJSON:
return printArbitraryJSON(searchReport)
case cmd.Flags().Changed("format"):
renderHeaders = report.HasTable(searchOptions.Format)
Expand Down Expand Up @@ -190,7 +200,7 @@ func printArbitraryJSON(v interface{}) error {
}

func buildListTagsJSON(searchReport []entities.ImageSearchReport) []listEntryTag {
entries := []listEntryTag{}
entries := make([]listEntryTag, 0)

ReportLoop:
for _, report := range searchReport {
Expand Down
2 changes: 1 addition & 1 deletion docs/source/markdown/podman-search.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ The result contains the Image name and its tag, one line for every tag associate

#### **--no-trunc**

Do not truncate the output (default *false*).
Do not truncate the output (default *true*).

#### **--tls-verify**

Expand Down
2 changes: 0 additions & 2 deletions pkg/api/handlers/compat/images_search.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ func SearchImages(w http.ResponseWriter, r *http.Request) {
query := struct {
Term string `json:"term"`
Limit int `json:"limit"`
NoTrunc bool `json:"noTrunc"`
Filters map[string][]string `json:"filters"`
TLSVerify bool `json:"tlsVerify"`
ListTags bool `json:"listTags"`
Expand Down Expand Up @@ -50,7 +49,6 @@ func SearchImages(w http.ResponseWriter, r *http.Request) {
options := entities.ImageSearchOptions{
Authfile: authfile,
Limit: query.Limit,
NoTrunc: query.NoTrunc,
ListTags: query.ListTags,
Filters: filters,
}
Expand Down
4 changes: 0 additions & 4 deletions pkg/api/server/register_images.go
Original file line number Diff line number Diff line change
Expand Up @@ -1090,10 +1090,6 @@ func (s *APIServer) registerImagesHandlers(r *mux.Router) error {
// default: 25
// description: maximum number of results
// - in: query
// name: noTrunc
// type: boolean
// description: do not truncate any of the result strings
// - in: query
// name: filters
// type: string
// description: |
Expand Down
2 changes: 0 additions & 2 deletions pkg/bindings/images/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -133,8 +133,6 @@ type SearchOptions struct {
Filters map[string][]string
// Limit the number of results.
Limit *int
// NoTrunc will not truncate the output.
NoTrunc *bool
// SkipTLSVerify to skip HTTPS and certificate verification.
SkipTLSVerify *bool
// ListTags search the available tags of the repository
Expand Down
15 changes: 0 additions & 15 deletions pkg/bindings/images/types_search_options.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 0 additions & 2 deletions pkg/domain/entities/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -218,8 +218,6 @@ type ImageSearchOptions struct {
Filters []string
// Limit the number of results.
Limit int
// NoTrunc will not truncate the output.
NoTrunc bool
// SkipTLSVerify to skip HTTPS and certificate verification.
SkipTLSVerify types.OptionalBool
// ListTags search the available tags of the repository
Expand Down
5 changes: 3 additions & 2 deletions pkg/domain/infra/abi/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,7 @@ func (ir *ImageEngine) Import(ctx context.Context, options entities.ImageImportO
return &entities.ImageImportReport{Id: imageID}, nil
}

// Search for images using term and filters
func (ir *ImageEngine) Search(ctx context.Context, term string, opts entities.ImageSearchOptions) ([]entities.ImageSearchReport, error) {
filter, err := libimage.ParseSearchFilter(opts.Filters)
if err != nil {
Expand All @@ -427,7 +428,7 @@ func (ir *ImageEngine) Search(ctx context.Context, term string, opts entities.Im
Authfile: opts.Authfile,
Filter: *filter,
Limit: opts.Limit,
NoTrunc: opts.NoTrunc,
NoTrunc: true,
InsecureSkipTLSVerify: opts.SkipTLSVerify,
ListTags: opts.ListTags,
}
Expand All @@ -454,7 +455,7 @@ func (ir *ImageEngine) Search(ctx context.Context, term string, opts entities.Im
return reports, nil
}

// GetConfig returns a copy of the configuration used by the runtime
// Config returns a copy of the configuration used by the runtime
func (ir *ImageEngine) Config(_ context.Context) (*config.Config, error) {
return ir.Libpod.GetConfig()
}
Expand Down
4 changes: 2 additions & 2 deletions pkg/domain/infra/tunnel/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import (
"github.com/containers/common/pkg/config"
"github.com/containers/image/v5/docker/reference"
"github.com/containers/image/v5/types"
images "github.com/containers/podman/v3/pkg/bindings/images"
"github.com/containers/podman/v3/pkg/bindings/images"
"github.com/containers/podman/v3/pkg/domain/entities"
"github.com/containers/podman/v3/pkg/domain/entities/reports"
"github.com/containers/podman/v3/pkg/domain/utils"
Expand Down Expand Up @@ -323,7 +323,7 @@ func (ir *ImageEngine) Search(ctx context.Context, term string, opts entities.Im

options := new(images.SearchOptions)
options.WithAuthfile(opts.Authfile).WithFilters(mappedFilters).WithLimit(opts.Limit)
options.WithListTags(opts.ListTags).WithNoTrunc(opts.NoTrunc)
options.WithListTags(opts.ListTags)
if s := opts.SkipTLSVerify; s != types.OptionalBoolUndefined {
if s == types.OptionalBoolTrue {
options.WithSkipTLSVerify(true)
Expand Down
25 changes: 20 additions & 5 deletions test/e2e/search_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ package integration

import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"os"
"regexp"
"strconv"
"text/template"

"github.com/containers/podman/v3/pkg/domain/entities"
. "github.com/containers/podman/v3/test/utils"
. "github.com/onsi/ginkgo"
. "github.com/onsi/gomega"
Expand Down Expand Up @@ -123,6 +125,15 @@ registries = ['{{.Host}}:{{.Port}}']`
Expect(search).Should(Exit(0))
Expect(search.IsJSONOutputValid()).To(BeTrue())
Expect(search.OutputToString()).To(ContainSubstring("docker.io/library/alpine"))

// Test for https://github.com/containers/podman/issues/11894
contents := make([]entities.ImageSearchReport, 0)
err := json.Unmarshal(search.Out.Contents(), &contents)
Expect(err).ToNot(HaveOccurred())
Expect(len(contents)).To(BeNumerically(">", 0), "No results from image search")
for _, element := range contents {
Expect(element.Description).ToNot(HaveSuffix("..."))
}
})

It("podman search format json list tags", func() {
Expand All @@ -135,13 +146,17 @@ registries = ['{{.Host}}:{{.Port}}']`
Expect(search.OutputToString()).To(ContainSubstring("2.7"))
})

It("podman search no-trunc flag", func() {
search := podmanTest.Podman([]string{"search", "--no-trunc", "alpine"})
// Test for https://github.com/containers/podman/issues/11894
It("podman search no-trunc=false flag", func() {
search := podmanTest.Podman([]string{"search", "--no-trunc=false", "alpine", "--format={{.Description}}"})
search.WaitWithDefaultTimeout()
Expect(search).Should(Exit(0))
Expect(len(search.OutputToStringArray())).To(BeNumerically(">", 1))
Expect(search.LineInOutputContains("docker.io/library/alpine")).To(BeTrue())
Expect(search.LineInOutputContains("...")).To(BeFalse())

for _, line := range search.OutputToStringArray() {
if len(line) > 44 {
Expect(line).To(HaveSuffix("..."), line+" should have been truncated")
}
}
})

It("podman search limit flag", func() {
Expand Down

0 comments on commit b28a8bc

Please sign in to comment.