Skip to content

Commit

Permalink
enable search using results limit
Browse files Browse the repository at this point in the history
Enable search registry specifying the number of results rather than using default API 100 limit.
BZ: https://bugzilla.redhat.com/show_bug.cgi?id=1827794

Signed-off-by: Qi Wang <[email protected]>
  • Loading branch information
QiWang19 committed Jun 23, 2020
1 parent 25c0786 commit b521ffe
Showing 1 changed file with 40 additions and 17 deletions.
57 changes: 40 additions & 17 deletions docker/docker_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -388,31 +388,54 @@ func SearchRegistry(ctx context.Context, sys *types.SystemContext, registry, ima
}

logrus.Debugf("trying to talk to v2 search endpoint")
resp, err := client.makeRequest(ctx, "GET", "/v2/_catalog", nil, nil, v2Auth, nil)
if err != nil {
logrus.Debugf("error getting search results from v2 endpoint %q: %v", registry, err)
} else {
searchRes := []SearchResult{}
resultLimit := limit
path := "/v2/_catalog"
for resultLimit > 0 {
resp, err := client.makeRequest(ctx, "GET", path, nil, nil, v2Auth, nil)
if err != nil {
logrus.Debugf("error getting search results from v2 endpoint %q: %v", registry, err)
return nil, errors.Wrapf(err, "couldn't search registry %q", registry)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
logrus.Errorf("error getting search results from v2 endpoint %q: %v", registry, httpResponseToError(resp, ""))
} else {
if err := json.NewDecoder(resp.Body).Decode(v2Res); err != nil {
return nil, err
return nil, errors.Wrapf(err, "couldn't search registry %q", registry)
}
if err := json.NewDecoder(resp.Body).Decode(v2Res); err != nil {
return nil, err
}

for _, repo := range v2Res.Repositories {
if resultLimit <= 0 {
break
}
searchRes := []SearchResult{}
for _, repo := range v2Res.Repositories {
if strings.Contains(repo, image) {
res := SearchResult{
Name: repo,
}
searchRes = append(searchRes, res)
if strings.Contains(repo, image) {
res := SearchResult{
Name: repo,
}
searchRes = append(searchRes, res)
resultLimit--
}
return searchRes, nil
}
}

return nil, errors.Wrapf(err, "couldn't search registry %q", registry)
link := resp.Header.Get("Link")
if link == "" {
break
}
linkURLStr := strings.Trim(strings.Split(link, ";")[0], "<>")
linkURL, err := url.Parse(linkURLStr)
if err != nil {
return searchRes, err
}

path = linkURL.Path
if linkURL.RawQuery != "" {
path += "?"
path += linkURL.RawQuery
}
}
return searchRes, nil
}

// makeRequest creates and executes a http.Request with the specified parameters, adding authentication and TLS options for the Docker client.
Expand Down

0 comments on commit b521ffe

Please sign in to comment.