summaryrefslogtreecommitdiff
path: root/registry/service.go
diff options
context:
space:
mode:
authorCory Snider <csnider@mirantis.com>2023-02-28 16:54:20 -0500
committerCory Snider <csnider@mirantis.com>2023-03-10 18:36:33 -0500
commit3991faf4640a46412a8af000ede78fc5cba76d0a (patch)
treece7a581e1bb15a2c75f668a4d29bb0bef737116c /registry/service.go
parent2fa66cfce2523f6e38bcccc1161055b46c3c6a90 (diff)
downloaddocker-3991faf4640a46412a8af000ede78fc5cba76d0a.tar.gz
Move filtered registry search out of image service
SearchRegistryForImages does not make sense as part of the image service interface. The implementation just wraps the search API of the registry service to filter the results client-side. It has nothing to do with local image storage, and the implementation of search does not need to change when changing which backend (graph driver vs. containerd snapshotter) is used for local image storage. Filtering of the search results is an implementation detail: the consumer of the results does not care which actor does the filtering so long as the results are filtered as requested. Move filtering into the exported API of the registry service to hide the implementation details. Only one thing---the registry service implementation---would need to change in order to support server-side filtering of search results if Docker Hub or other registry servers were to add support for it to their APIs. Use a fake registry server in the search unit tests to avoid having to mock out the registry API client. Signed-off-by: Cory Snider <csnider@mirantis.com>
Diffstat (limited to 'registry/service.go')
-rw-r--r--registry/service.go65
1 files changed, 2 insertions, 63 deletions
diff --git a/registry/service.go b/registry/service.go
index f12e10437f..2b300a7481 100644
--- a/registry/service.go
+++ b/registry/service.go
@@ -3,13 +3,12 @@ package registry // import "github.com/docker/docker/registry"
import (
"context"
"crypto/tls"
- "net/http"
"net/url"
"strings"
"sync"
"github.com/docker/distribution/reference"
- "github.com/docker/distribution/registry/client/auth"
+ "github.com/docker/docker/api/types/filters"
"github.com/docker/docker/api/types/registry"
"github.com/docker/docker/errdefs"
"github.com/sirupsen/logrus"
@@ -21,7 +20,7 @@ type Service interface {
LookupPullEndpoints(hostname string) (endpoints []APIEndpoint, err error)
LookupPushEndpoints(hostname string) (endpoints []APIEndpoint, err error)
ResolveRepository(name reference.Named) (*RepositoryInfo, error)
- Search(ctx context.Context, term string, limit int, authConfig *registry.AuthConfig, userAgent string, headers map[string][]string) (*registry.SearchResults, error)
+ Search(ctx context.Context, searchFilters filters.Args, term string, limit int, authConfig *registry.AuthConfig, headers map[string][]string) ([]registry.SearchResult, error)
ServiceConfig() *registry.ServiceConfig
LoadAllowNondistributableArtifacts([]string) error
LoadMirrors([]string) error
@@ -129,66 +128,6 @@ func splitReposSearchTerm(reposName string) (string, string) {
return nameParts[0], nameParts[1]
}
-// Search queries the public registry for images matching the specified
-// search terms, and returns the results.
-func (s *defaultService) Search(ctx context.Context, term string, limit int, authConfig *registry.AuthConfig, userAgent string, headers map[string][]string) (*registry.SearchResults, error) {
- // TODO Use ctx when searching for repositories
- if hasScheme(term) {
- return nil, invalidParamf("invalid repository name: repository name (%s) should not have a scheme", term)
- }
-
- indexName, remoteName := splitReposSearchTerm(term)
-
- // Search is a long-running operation, just lock s.config to avoid block others.
- s.mu.RLock()
- index, err := newIndexInfo(s.config, indexName)
- s.mu.RUnlock()
-
- if err != nil {
- return nil, err
- }
- if index.Official {
- // If pull "library/foo", it's stored locally under "foo"
- remoteName = strings.TrimPrefix(remoteName, "library/")
- }
-
- endpoint, err := newV1Endpoint(index, userAgent, headers)
- if err != nil {
- return nil, err
- }
-
- var client *http.Client
- if authConfig != nil && authConfig.IdentityToken != "" && authConfig.Username != "" {
- creds := NewStaticCredentialStore(authConfig)
- scopes := []auth.Scope{
- auth.RegistryScope{
- Name: "catalog",
- Actions: []string{"search"},
- },
- }
-
- modifiers := Headers(userAgent, nil)
- v2Client, err := v2AuthHTTPClient(endpoint.URL, endpoint.client.Transport, modifiers, creds, scopes)
- if err != nil {
- return nil, err
- }
- // Copy non transport http client features
- v2Client.Timeout = endpoint.client.Timeout
- v2Client.CheckRedirect = endpoint.client.CheckRedirect
- v2Client.Jar = endpoint.client.Jar
-
- logrus.Debugf("using v2 client for search to %s", endpoint.URL)
- client = v2Client
- } else {
- client = endpoint.client
- if err := authorizeClient(client, authConfig, endpoint); err != nil {
- return nil, err
- }
- }
-
- return newSession(client, endpoint).searchRepositories(remoteName, limit)
-}
-
// ResolveRepository splits a repository name into its components
// and configuration of the associated registry.
func (s *defaultService) ResolveRepository(name reference.Named) (*RepositoryInfo, error) {